2011-11-21 15 views
16

Çıkış için bir yol var mı, örn. list() kullanmadan 2 nesne?Çoklu çıkışlı bir işlevden nasıl atanılır?

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

Ya da 2 nesne listesi çıktı için mi?

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

Ve list(a,b) ve aynı işlevi için başka list(c,d) istedi: Ben de olabileceğini düşünürsek.

Bu, aradığım şey için küçük bir örnektir, işlevim büyük nesnelere uygulanır ve bunları bir liste olarak dışa aktarır, ancak aynı zamanda birleşik hesaplamayı da dışa aktarmak istiyorum. Bir seçenek, hepsi aynı listede birleştirmek olurdu, ancak bunun için başka bir çözüm olup olmadığını bilmek istiyorum.

+1

O istendi sonra bu yinelenen bir soru 1 yıl olduğuna karar verildi? –

+1

kişisel olarak almanıza gerek yok, StackOverflow'da çok sayıda kopya var ve çiftleri kapatıp işaretlemek, siteyi daha temiz tutmaya yardımcı oluyor ve ilgili sorulara referanslarla yardımcı oluyor. Çok sayıda kopya olduğundan ve hepsinin gözden geçirilmesi uzun zaman alabileceğinden, hemen her zaman kapalı değildir. – MByD

+1

feeback için teşekkürler @BinyaminSharet –

cevap

6

; Benim için, env parametre için tavsiye etmeyi trickiest biraz dışarı çalışıyordu:

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

'environment()' kullanmak isteyebilirsiniz ya da kullanmak istemeyebilirsiniz. Bu durumda Küresel Ortamı döndürür, ancak sadece mevcut değerlendirme ortamı olduğu için. –

+0

@JoshuaUlrich'in yazdıklarını genişletmek için, environment() size geçerli alanı (yani yerel değişkenlerinizin depolandığı yeri) verir. Bu, en sonunda bana yardımcı olan SO cevabıydı: http://stackoverflow.com/a/8773047/841830 –

3

Sana listelerini kullanarak sınırlıdır inanıyoruz, ama bunları gibi birleştirebilirsiniz:

> 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

dönüş() nesnesi bir şey ... Bir liste veya bir vektör olması gerekiyor. Eğer küresel (veya başka bir ortamda) işe başka "itme" bir şey kullanabilirsiniz istiyorsanız "< < -" veya eval gibi bir şey (..., envir = .GlobalEnv)

9

yapabilirsiniz yalnızca return bir nesne içinde bir işlev. Ama başka seçeneklerin var. Global ortama ara nesneler atayabilirsiniz (herhangi bir şeyin üzerine yazmamaya dikkat etmeniz gerekir) veya işlevinize bir ortam iletebilir ve nesneler atayabilirsiniz. İşte

ikincisi öneri bir örnek: Ben sizin tarif şey için list2env idealdir bulundu

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 İlk başta, "hey, cevabım buydu" diye düşündüm ve daha sonra sürümün benimkinden çok daha fazla yapılandırılmış ve iyi düşünülmüş olduğunu farkettim. –

+0

@DWin: Evet, cevabını yazarken, yazı yazıp yazmamaya devam ettiğimi (benzer olduklarından) gördüm. Ama sonra aynı şeyi farklı bir şekilde açıklamak için birisinin yararlı olabileceğini düşündüm. –

İlgili konular