2010-09-07 9 views
6

Utilizzo il pacchetto glmulti per adattarlo a diversi set di dati. Tutto funziona se si adatta un set di dati alla volta.Perché non posso passare un set di dati a una funzione?

Così, per esempio:

output <- glmulti(y~x1+x2,data=dat,fitfunction=lm) 

funziona bene.

Tuttavia, se creo una funzione wrapper in questo modo:

analyze <- function(dat) 
{ 
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm) 
return (out) 
} 

semplicemente non funziona. L'errore che ottengo è

error in evaluating the argument 'data' in selecting a method for function 'glmulti' 

A meno che non v'è un frame di dati di nome dat, non funziona. Se utilizzo results=lapply(list_of_datasets, analyze), non funziona. Quindi cosa dà? Senza il mio detto wrapper, non posso aggiungere una lista di set di dati attraverso questa funzione. Se qualcuno ha pensieri o idee sul perché questo sta accadendo o su come posso aggirarlo, sarebbe fantastico.

Esempio 2:

dat=list_of_data[[1]] 
analyze(dat) 

funziona bene. Quindi, in un certo senso, sta ignorando l'argomento e sta solo cercando letteralmente un frame dati denominato dat. Si comporta allo stesso modo, non importa come lo chiamo io.

risposta

8

Credo che questo è un altro- viaggio -Un problema dovuto alla definizione di ambienti in l'albero di analisi dei metodi di S4 (una delle resons perché io non sono un grande fan di S4 ...)

Si può essere dimostrato con l'aggiunta di citazioni in tutto il dat:

> analyze <- function(dat) 
+ { 
+ out<- glmulti(y~x1+x2,data="dat",fitfunction=lm) 
+ return (out) 
+ } 
> analyze(test) 
Initialization... 
Error in eval(predvars, data, env) : invalid 'envir' argument 

si dovrebbe in primo luogo inviare questa scheda ad manutentori del pacchetto, come sanno come trattare con gli ambienti internamente. Dovranno adattare le funzioni.

A -molto sporco- soluzione per te, è mettere "dat" nell'ambiente globale ed eliminarlo in seguito.

analyze <- function(dat) 
{ 
assign("dat",dat,envir=.GlobalEnv) # put the dat in the global env 
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm) 
remove(dat,envir=.GlobalEnv) # delete dat again from global env 
return (out) 
} 

EDIT: Solo per chiarezza, questo è veramente la peggiore soluzione possibile, ma non riuscivo a trovare qualcosa di meglio. Se qualcun altro ti dà una soluzione in cui non devi toccare il tuo ambiente globale, usa assolutamente quello.

+0

Grazie mille Joris. Devo davvero sedermi e confrontarmi con i metodi S4. Almeno per ora posso vedere come si comporta questa soluzione alternativa. Saluti. – Maiasaura

+0

Si comporta bene, purché non ci sia un oggetto chiamato "dat" nel proprio spazio di lavoro. In tal caso, questo verrà sovrascritto dalla funzione assign(). Questo è qualcosa che si vuole assolutamente evitare ... –

+1

Not the S4 and .GlobalEnv again: slap on the front :. –

Problemi correlati