2014-11-24 75 views
0

我在R中有一個函數來構造我的原始數據。我創建一個名爲output的數據框,然後根據函數值block設置一個動態變量名稱。從R函數中檢索/訪問動態變量

輸出對象確實包含一個數據幀,因爲我想,和動態重命名,在我做這個(函數內)的函數結束:

a = assign(paste("output", block, sep=""), output) 

...但在運行後功能沒有對象輸出1(如果block = 1)。我根本無法檢索輸出對象,不僅僅是output也不是動態的output1版本。

我嘗試這樣做,那麼:

A =分配(粘貼( 「輸出」,塊,九月= 「」),輸出) 回報(一)

...但還是 - 沒有成功。 如何檢索動態輸出變量?我的錯誤在哪裏?

+3

幾乎不可能說錯誤沒有一個可重複的例子,包括函數 – 2014-11-24 21:45:01

回答

4

環境。

assign默認情況下會在調用它的環境中創建一個變量。閱讀環境在這裏:http://adv-r.had.co.nz/Environments.html

我假設你正在做這樣的事情:

foo <- function(x){ assign("b", x); b} 

如果運行foo(5),你會看到它返回5預期(這意味着b成功創建的地方),但b將不會在您當前的環境中存在。

但是,如果你做這樣的事情

foo <- function(x){ assign("b", x, envir=parent.frame()); b} 

在這裏,你當時assign被稱爲(這恰好是foo的環境)未分配給當前的環境。相反,您將分配到父級環境中(因爲您直接調用此函數將會是您的環境)。

所有這些複雜性都會告訴你,這將會相當複雜,是一個噩夢來維護,並且從維護的角度來看是一個非常糟糕的主意。你一定會更好的東西,如:

foo <- function(x) { return(x) }; 
b <- foo(5) 

,或者您需要多個項目返回:

foo <- function(x) { return(list(df=data.frame(col1=x), b=x)) } 
results <- foo(5) 
df <- results$df 
b <- results$b 

但我們不是理由......

+1

你可以用'parent.frame()'替換'parent.env(environment())'以獲得更清晰的語義:) – 2014-11-24 22:25:37