2011-11-21 12 views
16

¿Hay alguna forma de generar resultados, p. 2 objetos sin usar list()?¿Cómo asignar desde una función con múltiples salidas?

my.fun=function(vector, index) 
     { 
     a=fun.a(vector, index) 
     b=fun.b(vector, index) 
     output=list(a,b) 
     } 

¿O en la salida 2 listas de objetos? Teniendo en cuenta que yo también podría tener:

 c=fun.a(vector, index) 
     d=fun.b(vector, index) 

y quería list(a,b) y otro list(c,d) para la misma función.

Esto es solo un pequeño ejemplo de lo que estoy buscando, mi función se aplica a objetos grandes y los exporto como una lista; sin embargo, me gustaría exportar también un cálculo intermedio. Una opción sería fusionar todo en la misma lista, pero me gustaría saber si hay otra solución para esto.

+1

Se decidió que este es un duplicado de la pregunta 1 año después de que se le pidió? –

+1

no necesita tomarlo personalmente, hay muchos duplicados en StackOverflow y el cierre y marcado de duplicados ayuda a mantener el sitio más limpio y con referencias a preguntas relacionadas. Como hay muchos duplicados y la revisión de todos ellos puede llevar mucho tiempo, no siempre se cierra de inmediato. – MByD

+1

gracias por el feeback @BinyaminSharet –

Respuesta

6

encontré list2env ideal para lo que usted está describiendo; el bit más difícil, para mí, fue la elaboración de lo que dan para el parámetro 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" 
+0

Puede o no desear usar 'environment()'. Devuelve el entorno global en este caso, pero solo porque es el entorno de evaluación actual. –

+0

Para ampliar lo que escribió @JoshuaUlrich, environment() le proporciona el alcance actual (es decir, dónde se almacenan las variables locales). Esta fue la respuesta SO que más me ayudó al final: http://stackoverflow.com/a/8773047/841830 –

3

Creo que usted está limitado al uso de listas, pero se pueden combinar como:

> 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 
3

El retorno() objeto tiene que ser una cosa ... una lista o un vector. Si usted quiere "empujar" algo más en el (medio ambiente u otro) mundial se puede utilizar "< < -" o algo así eval (..., medio amb = .GlobalEnv)

9

Sólo puede return un objeto en Una función. Pero tienes algunas otras opciones. Puede asignar objetos intermedios al entorno global (debe tener cuidado de no sobrescribir nada) o puede pasar un entorno a su función y asignarle objetos.

He aquí un ejemplo de esta última sugerencia:

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 
+0

+1 Al principio pensé, "hey esa fue mi respuesta" y luego me di cuenta de que tu versión era mucho más estructurada y bien pensada que la mía. –

+0

@DWin: sí, vi tu respuesta mientras escribía la mía y debatí sobre si publicar o no (ya que son similares). Pero luego pensé que podría ser útil para alguien escuchar lo mismo explicado de otra manera. –

Cuestiones relacionadas