2017-08-18 2 views
0

mit I wie dies mit einer Unterschrift eine Funktion hatte:intelligent auf die Ellipsen in einer R-Funktion

myFunction=function(class="Class",v1='y',v2='y',dfparam=df){ 

wo df ein Datenrahmen ist, und es wird angenommen, dass es ein Attribut Class in df bezeichnet wird. Ich wollte es allgemeiner machen, so dass es eine Vielzahl von Datenrahmen akzeptieren kann, df, nicht nur eine, die ein Attribut namens Klasse hat. Also fügte ich einen className Parameter hinzu und classValue Parameter, um den Klassenparameter zu ersetzen. Auch möchte ich unbegrenzte Argumente v1 ermöglichen, v2, v3 usw. und so bin ich mit den Elipsis wie folgt aus:

myFunctionGeneral = function(className="Class", classValue="democrat", dfparam=df, ...){ 
    arguments <- list(...) 

vor der Verwendung des Elipsis hatte ich eine Linie, die die Argumente wie folgt verwendet:

X_bool=dfparam$V1==v1 & dfparam$V2==v2 

ich begann diese Weise aus:

X_bool=dfparam[,2]==arguments[1] & dfparam[,3]==arguments[2] 

aber ich möchte dies für eine unbegrenzte Anzahl von möglichen paremeters im Elipsis tun. Also muss ich erweitern diese Aussage durch irgendwie Entwirrung der Ellipse. Hier ist ein Beispiel:

install.packages("vcd") 
library(vcd) 
data(Arthritis) 
AAr=Arthritis[,-c(1,4)] 


myFunctionGeneral=function(className="Class",classValue="democrat",dfparam=df, ...){ 

    dfparam$names<-rownames(dfparam) 
    arguments<-list(...) 


    dfparamDroppedClass=dfparam[,-1] 
    #X_bool=dfparam[,2]==arguments[1] & dfparam[,3]==arguments[2] 
    X_bool=do.call(all, Map("==", dfparamDroppedClass, arguments)) 


    X=dfparam[X_bool,] 


} 

Antwort

0

Dies das Prinzip veranschaulichen soll:

arguments <- list(1, 2, 3) 
params <- list(1, 2, 3) 
do.call(all, Map("==", arguments, params)) 
#[1] TRUE 

params <- list(1, 2, 4) 
do.call(all, Map("==", arguments, params)) 
#[1] FALSE 

Alle entsprechen eine beliebige Anzahl von & und Map Iterierten == über die beiden Listen.

Bearbeiten: Anscheinend hat Ihr data.frame mehr als eine Beobachtung. Dann können Sie all nicht verwenden, aber müssen Reduce wie in Reduce("&", Map("==", arguments, params)) verwenden. Mit Ihrem Beispiel:

myFunctionGeneral=function(className="Class",classValue="democrat",dfparam=df, ...){ 

    dfparam$names<-rownames(dfparam) 
    arguments<-list(...) 

    dfparamDroppedClass=dfparam[, -c(1, 4)] 
    #X_bool=dfparam[,2]==arguments[1] & dfparam[,3]==arguments[2] 
    X_bool=Reduce("&", Map("==", dfparamDroppedClass, arguments)) 

    dfparam[X_bool,]  
} 

myFunctionGeneral('Treatment','Placebo',AAr,'Male','Marked') 
# Treatment Sex Improved names 
#4 Treated Male Marked  4 
#5 Treated Male Marked  5 
#6 Treated Male Marked  6 
#8 Treated Male Marked  8 
#14 Treated Male Marked 14 
#52 Placebo Male Marked 52 
+0

Vielen Dank. Ich denke, Argumente <-list (...) ist analog zu Ihren Argumenten <- list (1, 2, 3), aber ich brauche auch eine Liste, die dfparam [, 2], dfparam [, 3] usw. enthält es muss auch dynamisch die gleiche Größe wie Argumente haben und muss mit 2 nicht 1 beginnen. Haben Sie eine Idee dafür? – matt

+0

Ein data.frame ist auch eine Liste. Und Sie wissen, wie Sie die erste Spalte eines data.frames entfernen, oder? – Roland

+0

Danke! Ich habe es versucht: dfparamDroppedClass = dfparam [, - 1] und dann folgendes: X_bool = do.call (all, Map ("==", dfparamDroppedClass, Argumente)). Aber ich bekomme eine Warnung Warnmeldung: In Mapply (FUN = f, ..., SIMPLIFY = FALSCH): längeren Argument kein Vielfaches der Länge kürzer. Und auch die Funktion, die ich schreibe, erzeugt nicht die richtige Ausgabe. Wenn ich es mit diesem ausführen: X_bool = dfparam [, 2] == Argumente [1] & dfparam [, 3] == Argumente [2], scheint es zu funktionieren. – matt

Verwandte Themen