【发布时间】:2016-09-20 18:37:41
【问题描述】:
可以计算以下形式的字符串,使其等效于相同的“文字”表达式吗?
示例数据和代码:
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())) 均未成功。
我正在尝试创建一个函数,该函数将使用传递给函数的col.name 搜索(子集)df.name。我想避免为每个列名编写单独的函数,尽管这样可以工作,因为我可以将 df.name$col2[row.num] 编码为“文字”。
编辑
示例代码应该将 row.num 显示为数字/整数类型,即row.num = 4
【问题讨论】:
-
将代码解析为字符串永远不是答案。
df.name[[col.name]][as.numeric(row.num)]对您来说是一种可能。但我认为你应该问问自己你是如何以行号的字符表示结束的,然后从那里开始。 -
如果你真的需要这样做,
eval(parse(text=var1))应该可以工作(它对我有用)。但是@RichScriven 的解决方案(但使用get(df.name)而不是df.name)应该可以工作。 -
@Rich Scriven - 行号来自“for 循环”。示例代码只是为了展示构造。手头的任务是不可矢量化的,因为未来的行取决于先前行的结果。同样,对于需要从中检索值的每一列,我可以通过单独的函数来避免 paste/str_c。但是,如果我可以将列名作为参数传递给函数,那么我只需要一个函数。