2016-05-13 6 views
3

Wie im Titel beschrieben, versuche ich, einen Vektor mit Strings zu durchlaufen, der die Namen von data.frames sein kann oder kann. Es muss kein Vektor sein, eigentlich war es ein data.frame, wo ich eine Spalte extrahiert habe. Hier ist, was ich versucht habe:Schleife über einen Vektor und prüfen, ob data.frames mit dem gleichen Namen vorhanden sind

tables <- as.vector(df.stattributes.run[,1]) 

das gibt

Tabellen [1] "t-Test" "ttest2" "mtcars"

Dann fange ich das

Schleife
for (i in 1:length(tables)) 
    {try(if(!is.data.frame(as.name(tables[i])) == TRUE) stop(paste("Table",tables[i],"doesn't exist.")) else print(paste("Table",tables[i],"found")))} 

Dies gibt immer wieder „Table ... nicht gefunden. " obwohl mtcars ein existierender data.frame ist. Was kann ich ändern, damit es funktioniert? Vielen Dank!

Antwort

5

Sie können mget() mit inherits=T verwenden und ifnotfound=list(NULL) (oder einem nicht-data.frame Wert) und gelten is.data.frame() zu jeder:

sapply(mget(tables,inherits=T,ifnotfound=list(NULL)),is.data.frame); 
## ttest ttest2 mtcars 
## FALSE FALSE TRUE 

Der Grund, warum inherits=T notwendig hier ist, dass mtcars nicht residieren Sie in der globalen Umgebung, wo mget() standardmäßig aussehen wird, wenn Sie es auf oberster Ebene ausführen. Es befindet sich tatsächlich in der öffentlichen Umgebung des integrierten Datasets-Pakets. Sie können find() verwenden, um festzustellen, wo ein Objekt befindet:

find('mtcars'); 
## [1] "package:datasets" 

Auch gibt es einige Missverständnisse ich hier ansprechen sollte. Die as.name() Funktion entspricht exakt as.symbol(). Diese Funktionen zwingen das gegebene Argument zum Symboltyp.

Der Symboltyp ist ein Teil von Rs Darstellung der R-Sprache selbst oder mit anderen Worten des R-Parsebaums unter Verwendung von R-Datentypen. Um es anders auszudrücken, könnte man sagen, dass es Teil des R-Datenmodells von R ist. Siehe meine Antwort here für weitere Informationen zu diesem Thema.

Meistens müssen die meisten R-Programmierer nicht mit Symbolen arbeiten, weil sie nicht "auf der Sprache berechnen" müssen, wie sie oft genannt wird (was bedeutet, dass sie keine R-Parse-Bäume manipulieren müssen)).

In Ihrem Code erzwingen Sie den Zeichenfolgenwert in tables[i] mit as.name() zum Symboltyp, und dann übergeben Sie das resultierende Symbolobjekt an is.data.frame(). Das ist falsch. Der Aufruf von is.data.frame() für ein Symbolobjekt gibt immer false zurück, da ein Symbol kein data.frame ist. Im Allgemeinen arbeiten die is.* Funktionen auf den Typ gegebenen Objekts; sie tun nicht tun irgendeine Art von "Auflösung" oder "Suche" oder "Suche", um das ultimative Objekt zu finden, auf das sich das Argument bezieht; Das Argument ist das Objekt, das die is.*-Funktion Typprüfung ist.

Zweiter Punkt, Sie müssen == TRUE nicht tun.Wenn Sie bereits einen logischen Wert haben, dann ist es bereits wahr, in diesem Fall würde der Vergleich es als wahr verlassen oder es wäre bereits falsch, in welchem ​​Fall der Vergleich es als falsch belassen würde (oder es wird bereits NA sein , in diesem Fall würde der Vergleich es als NA verlassen).


Witzigerweise nach der obigen Erklärung schreibe ich realisiert habe, dass es eine alternative Möglichkeit ist, ein Objekt zu erhalten, dessen Name in einem String-Wert gespeichert ist, und es tut eigentlich die as.symbol()/as.name() Funktionen beinhalten ich etwas entlassen über. Ich spreche über eval() auf das Symbol Objekt aufrufen:

head(eval(as.symbol(tables[3L]))); 
##     mpg cyl disp hp drat wt qsec vs am gear carb 
## Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
## Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
## Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 
is.data.frame(eval(as.symbol(tables[3L]))); 
## [1] TRUE 

So können wir wirklich sagen, dass Sie durch den Aufruf as.name() auf dem richtigen Weg waren.

+0

Vielen Dank, das funktioniert offensichtlich. Lustig habe ich auch mit eval ausprobiert aber das Kombinieren der beiden Ausdrücke kam mir nicht in den Sinn :) – mariego

+0

Du bist herzlich willkommen :) – bgoldst

Verwandte Themen