Как назначить функцию с несколькими выходами?
Есть ли способ вывода, например. 2 объекта без использования list()
?
my.fun=function(vector, index)
{
a=fun.a(vector, index)
b=fun.b(vector, index)
output=list(a,b)
}
Или для вывода 2 списков объектов? Учитывая, что я мог бы также:
c=fun.a(vector, index)
d=fun.b(vector, index)
И хотел list(a,b)
и еще один list(c,d)
для той же функции.
Это лишь небольшой пример того, что я ищу, моя функция применяется к крупным объектам, и я экспортирую их как список, однако я бы хотел экспортировать также промежуточный расчет. Один из вариантов - объединить все в один список, но я хотел бы знать, есть ли другое решение для этого.
Ответы
Ответ 1
Я нашел list2env
идеальным для того, что вы описываете; самый сложный бит, для меня, заключался в том, что нужно дать для параметра env
:
f=function(){
list(a=1,b="my string")
}
ret=f()
list2env(ret,env=environment())
#a=ret$a;b=ret$b #Same as previous line
print(a);print(b) #1 and "my string"
Ответ 2
Вы можете использовать только return
один объект в функции. Но у вас есть другие варианты. Вы можете назначить промежуточные объекты для глобальной среды (вам нужно быть осторожным, чтобы не перезаписывать что-либо), или вы можете передать среду своей функции и назначить ей объекты.
Вот пример последнего предложения:
fun <- function(x, env) {
env$x2 <- x^2
x^3
}
set.seed(21)
x <- rnorm(10)
myEnv <- new.env()
fun(x, myEnv)
# [1] 4.987021e-01 1.424421e-01 5.324742e+00 -2.054855e+00 1.061014e+01
# [6] 8.125632e-02 -3.871369e+00 -8.171530e-01 2.559674e-04 -1.370917e-08
myEnv$x2
# [1] 6.288699e-01 2.727464e-01 3.049292e+00 1.616296e+00 4.828521e+00
# [6] 1.876023e-01 2.465527e+00 8.740486e-01 4.031405e-03 5.728058e-06
Ответ 3
Я считаю, что вы ограничены использованием списков, но вы можете комбинировать их так:
> list(list(a=1, b=2), list(c=3, d=4))
[[1]]
[[1]]$a
[1] 1
[[1]]$b
[1] 2
[[2]]
[[2]]$c
[1] 3
[[2]]$d
[1] 4
Ответ 4
Объект return()
должен быть одной вещью... list
или vector
. Если вы хотите "вставить" что-то еще в глобальную (или другую среду), вы можете использовать <<-
, хотя это считается плохой практикой.