2011-11-15 5 views
5

Voglio trovare un set di funzioni e salvarle, perché voglio inviarle a un server remoto in un file Rdata, e non voglio installare un nuovo pacchetto sul server.Come cercare un ambiente usando ls() all'interno di una funzione?

Anche se ricevo un errore utilizzando l'approccio riportato di seguito, sono preferibili approcci più facili/migliori.

MWE:

Qui ci sono due funzioni fittizie:

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

posso identificare le funzioni fittizie:

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

Ma quando ho avvolgere questo in una funzione:

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

La funzione restituisce character(0)

In ultima analisi vorrei

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

risposta

9
  1. Perché non utilizzare l'argomento pattern= a ls?
  2. Calling ls all'interno di una funzione elenca gli oggetti che esistono nell'ambito funzione, non l'ambiente globale (questo è spiegato in ?ls).

Se si desidera elencare gli oggetti nell'ambiente globale da una funzione, specificare 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() è preferito in questi giorni – hadley

+0

@hadley: potresti spiegare perché? –

+0

Hmmm, avrei potuto giurarlo ha suggerito che nella documentazione, ma credo di no. In tal caso è solo un'opinione personale: penso che sia meglio usare una funzione piuttosto che globale. – hadley

7

È necessario indicare alla funzione di elencare gli oggetti in un ambiente diverso da sé, ad es. l'ambiente globale. (E già che ci sei, è anche possibile specificare il modello di espressione regolare come argomento per ls.):

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

Vedi ?ls per maggiori informazioni su ls() e ?environment per altre opzioni da specificare l'ambiente.