2011-11-21 34 views
16

有沒有辦法輸出例如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

會議決定,這是一個重複的問題1今年才問之後? –

+1

你不需要親自採取它,在StackOverflow中有很多重複項,並且關閉和標記重複項有助於保持站點更清潔並引用相關問題。由於有很多重複,並且所有這些重複的審查可能需要很長時間,所以並不總是立即關閉。 – MByD

+1

感謝您的反饋@BinyaminSharet –

回答

6

我發現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" 
+0

你可能會也可能不想使用'environment()'。它在這種情況下返回全球環境,但僅僅是因爲它是當前的評估環境。 –

+0

爲了擴展@Jos​​huaUlrich所寫的內容,environment()爲您提供了當前的範圍(即您的本地變量的存儲位置)。這是最終幫助我的SO回答:http://stackoverflow.com/a/8773047/841830 –

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 
3

()的返回對象必須是一件事......一個列表或向量。如果你想「推」東西進入全球(或其他環境),可以使用「< < - 」或類似的eval(...,ENVIR = .GlobalEnv)

9

你只能在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 
+0

+1起初,我想,「嘿,那是我的答案」,然後意識到你的版本比我的結構更好,思路更深。 –

+0

@DWin:是的,我在寫我的時候看到了你的回答,並辯論是否發帖(因爲他們很相似)。但是後來我認爲讓別人聽到以不同方式解釋的相同內容可能會有幫助。 –