2016-11-16 36 views
1

這個問題類似:如何在函數環境中將R列表的元素作爲獨立對象返回?

Return elements of list as independent objects in global environment

我似乎無法適應答案指定列表中的元素時list2env被稱爲函數內部:

例如

lst <- list(a = c(1, 2), b = c(3, 4)) 

tmp_fn <- function(lst) { 
    # do computations on list elements 
    # first assign each to the function environment 
    list2env(lst, parent = parent.frame()) # fails 

    # do stuff 
    ... 
} 

我以爲parent = parent.frame()會的工作,但在調試tmp_fn我只看到lst被分配給功能環境的列表,而不是單個變量ab

+0

也許你只是想在你的函數中附加(lst)? 'pos'參數可能更友好,而且默認的'2L'我認爲可以做你想要的。 – Gregor

+0

我認爲'attach'不推薦? – Alex

+0

'attach'不推薦,但你正在嘗試做什麼'attach'。一般的建議是使用你的'list'。 – Gregor

回答

2

1)這裏使用envir=而不是parent=這樣。此外,如圖所示,可能希望添加envir作爲參數靈活性:

lst <- list(a = c(1, 2), b = c(3, 4)) 

tmp_fn <- function(lst, envir = parent.frame()) { 
    invisible(list2env(lst, envir = envir)) 
} 
tmp_fn(lst) 

2)另一種可能性是使用list[...]<-從gsubfn包(開發版本):

devtools::install_github("ggrothendieck/gsubfn") 
library(gsubfn) 

func <- function(lst) lst 
list[a, b] <- func(lst) 

現在ab將在當前環境中。

+0

我已經嘗試了您的第一個解決方案,謝謝。似乎你可能會誤解我的問題。我不想要一個函數'tmp_fn',它將list對象分配到'tmp_fn'的調用環境中。相反,我希望元素在被調用時被分配到'tmp_fn'環境中。你的解決方案仍然有效,因爲我可以做類似的事情'tmp_fn2 < - function(lst){tmp_fn1(lst)}',它將'lst'元素分配到'tmp_fn2'的函數環境中。然而,我不知道是否有一個更直接的方法來做到這一點,而不需要定義另一個函數。 – Alex

+0

你可以指定'envir'做任何你想要的。例如,將envir的默認值定義爲'envir = parent.env(environment())'而不是'envir = parent.frame()' –

相關問題