2016-09-20 68 views
0

可以評估以下形式的字符串,以便它等同於相同的「文字」表達式。

實施例的數據和代碼

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]" 

字面按預期工作

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

的get()是不等價

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

這種形式的get() 「作品」,但不解決問題

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

其他職位我試過eval(parse())和eval(parse(text()))沒有成功。

我試圖創建一個函數,將搜索(子集)df.name使用col.name傳遞給函數。我想避免爲每個列名寫一個單獨的函數,儘管這樣可以工作,因爲我可以將df.name$col2[row.num]編碼爲「文字」。

EDIT

的示例代碼應該所示的row.num類型數字/整數,即row.num = 4

+2

將字符串解析爲字符串永遠不會是答案。 'df.name [[col.name]] [as.numeric(row.num)]'是你的可能性。但我想你應該問問自己,你是如何以一個行號的字符表示結束並從那裏開始的。 –

+0

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

+0

如果你真的需要這樣做,'eval(parse(text = var1))'應該可以工作(它對我有用)。但@ RichScriven的解決方案(但用'get(df.name)'而不是'df.name')應該可以工作。 –

回答

1

我想創建一個函數,它將使用傳遞給函數的col.name來搜索(子集)df.name。

設置數據:

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" 

解決您的最終(指數列名的數據幀),而不是你的近端(弄清楚如何使用get()/eval()等)的問題:作爲@RichardScriven指出,

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

應該工作。如果您將行號指定爲數字而不是字符(如果可能的話),它可能更具慣用性......

+0

我會編輯我的問題,注意示例行號應該更合適的是numeric()。 –

1

你幾乎有:

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

由於解析由默認期待文件,您需要指定text參數。