2010-09-07 21 views
6

Ich verwende das Paket , um Modelle an mehrere Datensätze anzupassen. Alles funktioniert, wenn ich jeweils einen Datensatz packe.Warum kann ich ein Dataset nicht an eine Funktion übergeben?

So zum Beispiel:

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

funktioniert gut.

Allerdings, wenn ich eine Wrapper-Funktion wie so erstellen:

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

einfach nicht funktioniert. Der Fehler, den ich bekomme, ist

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

Es sei denn, es gibt einen Datenrahmen namens dat, es funktioniert nicht. Wenn ich results=lapply(list_of_datasets, analyze) verwende, funktioniert es nicht. Also was gibt es? Ohne meinen besagten Wrapper kann ich keine Liste von Datensätzen durch diese Funktion plat- zieren. Wenn jemand Gedanken oder Ideen darüber hat, warum dies geschieht oder wie ich es umgehen kann, wäre das großartig.

Beispiel 2:

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

funktioniert gut. In gewisser Weise ignoriert es das Argument und sucht buchstäblich nach einem Datenrahmen namens dat. Es verhält sich gleich, egal wie ich es nenne.

Antwort

8

Ich denke, das ist -yet another- Problem aufgrund der Definition von Umgebungen in dem Parsing-Baum von Methoden S4 (einer der resons, warum ich bin kein großer Fan von S4 ...)

Es kann durch Hinzufügen von Anführungszeichen um die dat gezeigt werden:

> 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 

Sie sollten in erster Linie diese Informationen an die Maintainer des Pakets senden, da sie wissen, wie sie mit den Umgebungen intern behandeln. Sie müssen die Funktionen anpassen.

Ein sehr dreckiger Workaround für Sie ist es, "dat" in die globale Umgebung zu stellen und anschließend zu löschen.

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: Gerade für Klarheit, das ist wirklich über die schlechteste Lösung möglich, aber ich konnte es nicht schaffen etwas Besseres zu finden. Wenn jemand anderes Ihnen eine Lösung gibt, bei der Sie Ihre globale Umgebung nicht berühren müssen, verwenden Sie diese auf jeden Fall.

+0

Dank eine Tonne Joris. Ich muss mich wirklich hinsetzen und S4-Methoden anwenden. Zumindest kann ich jetzt sehen, wie sich diese Problemumgehung verhält. Prost. – Maiasaura

+0

Es verhält sich gut, solange Sie in Ihrem Arbeitsbereich kein Objekt namens "dat" haben. Wenn dies der Fall ist, wird dieser durch die Funktion assign() überschrieben. Das ist etwas, was du unbedingt vermeiden willst ... –

+1

Nicht die S4 und .GlobalEnv wieder: Schlag auf die Stirn :. –

Verwandte Themen