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

问题描述 投票:0回答:2

下面形式的字符串是否可以求值,使其等同于相同的“文字”表达式?

示例数据和代码:

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]编码为“文字”。

编辑

示例代码应该已将row.num显示为数字/整数类型,即row.num = 4

r get eval
2个回答
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)])
}

应该工作。如果将行号指定为数字而不是字符,则可能更惯用……


1
投票

您几乎在那里:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.