2011-11-21 12 views
16

Czy istnieje sposób na wyjście, np. 2 obiekty bez użycia list()?Jak przypisać funkcję z wieloma wyjściami?

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

Albo na wyjście 2 listy obiektów? Biorąc pod uwagę, że mogę mieć:

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

i chciał list(a,b) i inny list(c,d) dla tej samej funkcji.

To tylko mały przykład tego, czego szukam, moja funkcja jest stosowana do dużych obiektów i eksportuję je jako listę, ale chciałbym również wyeksportować obliczenia pośrednie. Jedną opcją byłoby scalenie wszystkich na tej samej liście, ale chciałbym się dowiedzieć, czy istnieje inne rozwiązanie tego problemu.

+1

Zdecydowano, że jest to duplikat pytanie 1 rok po tym jak został poproszony? –

+1

nie musisz brać tego osobiście, istnieje wiele duplikatów w StackOverflow, a zamykanie i oznaczanie duplikatów pomaga utrzymać czystość witryny i odniesienia do powiązanych pytań. Ponieważ istnieje wiele duplikatów i przegląd wszystkich z nich może zająć dużo czasu, nie zawsze jest natychmiast zamykany. – MByD

+1

dzięki za odszukanie @BinyaminSharet –

Odpowiedz

6

znalazłem list2env idealny do tego, co opisujesz; Najtrudniejsza trochę dla mnie pracował, co dać na parametrze 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

Możesz lub nie chcesz użyć 'environment()'. Zwraca to globalne środowisko w tym przypadku, ale tylko dlatego, że jest to obecne środowisko oceny. –

+0

Aby rozwinąć to, co napisał @JoshuaUlrich, environment() podaje aktualny zakres (tj. Miejsce przechowywania zmiennych lokalnych). To była odpowiedź, która pomogła mi w końcu: http://stackoverflow.com/a/8773047/841830 –

3

wierzę jesteś ograniczony do korzystania z list, ale można połączyć je jak:

> 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

Zwrot() obiekt musi być jedno ... listy lub wektorem. Jeśli chcesz, aby „push” coś innego do globalnego (lub innego środowiska), można użyć „< < -” lub coś podobnego eval (... Środ = .GlobalEnv)

9

Można tylko jeden obiekt w return funkcja. Ale masz kilka innych opcji. Możesz przypisać obiekty pośrednie do środowiska globalnego (musisz uważać, aby niczego nie zastąpić) lub możesz przekazać środowisko do swojej funkcji i przypisać do niej obiekty.

Oto przykład tej ostatniej sugestii:

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 Początkowo myślałem, "hej, to była moja odpowiedź", a następnie uświadomiłem sobie, że twoja wersja była znacznie bardziej uporządkowana i przemyślana niż moja. –

+0

@DWin: tak, widziałem twoją odpowiedź podczas pisania mojego i zastanawiałem się, czy wysłać (bo są podobne). Ale wtedy pomyślałem, że może to być pomocne dla kogoś, aby usłyszeć to samo wyjaśnione w inny sposób. –

Powiązane problemy