2016-09-20 7 views
0

Kann eine Zeichenfolge des folgenden Formulars ausgewertet werden, sodass sie dem gleichen "Literal" -Ausdruck entspricht.

Beispiel Daten und Code

df.name = data.frame(col1 = 1:5, col2 = LETTERS[seq(1:5)], col3 = letters[seq(1:5)], stringsAsFactors = FALSE) 
col.name = "col2" 
row.num = "4" 

var1 = str_c("df.name$", col.name,"[",row.num,"]") 

> var1 
[1] "df.name$col2[4]" 

Die wörtliche funktioniert wie erwartet

> df.name$col2[4] 
[1] D 

get() ist nicht gleichbedeutend

get(var1) 
Error in get(var1) : object 'df.name$col2[4]' not found 

Diese Form von get() "funktioniert" aber löst nicht das Problem

get("df.name")$col2[4] 
[1] D 

Pro andere Beiträge habe ich versucht, eval (parse()) und eval (parse (text())) ohne Erfolg.

Ich versuche, eine Funktion zu erstellen, die (df.name) unter Verwendung der col.name, die an die Funktion übergeben wird. Ich möchte vermeiden, eine separate Funktion für jeden Spaltennamen zu schreiben, obwohl das funktionieren wird, da ich df.name$col2[row.num] als ein "Literal" codieren kann.

EDIT

Der Beispielcode die row.num als Typ numeric/integer gezeigt haben sollte, dh row.num = 4

+2

Parsing Code als Strings ist nie die Antwort. 'df.name [[col.name]] [as.numeric (row.num)]' ist eine Möglichkeit für Sie. Aber ich denke, du solltest dich fragen, wie du mit einer Zeichendarstellung einer Zeilennummer endete und dort anfängst. –

+0

Near-Duplikat: http://stackoverflow.com/questions/39560780/how-do-i-refer-to-a-data-frame-element-with-strings-in-r/39563674#39563674 –

+0

wenn Sie wirklich Dazu muss 'eval (parse (text = var1))' funktionieren (funktioniert bei mir). Aber @ RichScriven's Lösung (aber mit 'get (df.name)' anstelle von 'df.name') sollte funktionieren. –

Antwort

1

Ich versuche, eine Funktion zu erstellen, die sucht (Teilmenge) df.name mit dem col.name an die Funktion übergeben wird.

Set up Daten:

df.name = data.frame(col1 = 1:5, col2 = LETTERS[1:5], ## seq() is unnecessary 
        col3 = letters[1:5], 
        stringsAsFactors = FALSE) 
col.name = "col2" 
row.num = "4" 

Lösen Sie Ihre ultimative (Index der Datenrahmen durch Spaltenname) anstatt Ihre proximalen (herauszufinden, wie get()/eval() usw. verwenden) Frage: wie @RichardScriven weist darauf hin,

f <- function(col.name,row.num,data=df.name) 
    return(data[[col.name]][as.numeric(row.num)]) 
} 

sollte funktionieren. Es wäre wahrscheinlich idiomatischer, wenn Sie die Zeilennummer als numerisch statt als Zeichen angeben würden, wenn möglich ...

+0

Ich werde meine Frage bearbeiten, um zu beachten, dass die Beispielzeilennummer passendererweise numeric() war. –

1

Sie sind fast da:

> eval(parse(text = var1)) 
[1] "D" 

Da standardmäßig erwartete Datei parsen , müssen Sie den Parameter text angeben.

Verwandte Themen