R评估存储为字符串值的dataframe $列表达式

时间:2016-09-20 18:37:42

标签: r get eval

可以对下面表格的字符串进行评估,使其等同于"字面值"表达

示例数据和代码

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]编码为" literal"。

修改

示例代码应该将row.num显示为numeric / integer类型,即row.num = 4

2 个答案:

答案 0 :(得分:1)

你快到了:

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

由于默认情况下解析需要文件,因此需要指定text参数。

答案 1 :(得分: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)])
}

应该有效。如果你将行号指定为数字而不是字符,那么它可能会更加惯用,如果可能的话......