Подтвердить что ты не робот

Как назначить функцию с несколькими выходами?

Есть ли способ вывода, например. 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) для той же функции.

Это лишь небольшой пример того, что я ищу, моя функция применяется к крупным объектам, и я экспортирую их как список, однако я бы хотел экспортировать также промежуточный расчет. Один из вариантов - объединить все в один список, но я хотел бы знать, есть ли другое решение для этого.

4b9b3361

Ответ 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. Если вы хотите "вставить" что-то еще в глобальную (или другую среду), вы можете использовать <<-, хотя это считается плохой практикой.