2011-11-15 19 views
5

我想找到一組函數並保存它們,因爲我想將它們發送到Rdata文件中的遠程服務器,並且我不想在服務器上安裝新的程序包。如何在函數內使用ls()搜索環境?

雖然我使用下面的方法出現錯誤,但更容易/更好的方法是受歡迎的。

MWE:

這裏有兩個虛擬功能:

abcd.fun.1 <- function() return(1) 
abcd.fun.2 <- function() return(2) 

我可以識別虛擬功能:

ls()[grep('abcd', ls())] 

但是,當我在一個函數把這個包:

find.test <- function(x) { 
    return(ls()[grep(x, ls())]) 
} 
find.test('abcd') 

該函數返回character(0)

最後,我想

save(find.test('abcd'), file = test.Rdata) 

回答

9
  1. 爲什麼不使用pattern=參數ls
  2. 調用ls函數內部列出了 函數範圍內的對象,而不是全局環境(這在?ls中解釋過)。

如果要從函數列出全局環境中的對象,請指定envir=.GlobalEnv

x <- 1:10 
f <- function() ls() 
g <- function() ls(envir=.GlobalEnv) 
h <- function() ls(envir=.GlobalEnv, pattern="[fg]") 
f() 
# character(0) 
g() 
# [1] "f" "g" "h" "x" 
h() 
# [1] "f" "g" 
+0

globalenv()這些天最好是 – hadley

+0

@hadley:你能解釋一下爲什麼嗎? –

+0

嗯,我可以發誓它建議在文檔中,但我猜不是。在這種情況下,這只是個人觀點:我認爲使用功能比全球更好。 – hadley

7

您需要告訴您的函數列出除自身以外的環境中的對象,例如,全球環境。 (雖然你在它,你還可以指定正則表達式作爲參數傳遞給ls):

find.test <- function(x, envir=.GlobalEnv) { 
    ls(pattern=x, envir=envir) 
} 

其他選項來指定環境有關ls()?environment?ls獲取更多信息。