2016-09-20 65 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参数。