能否在data.table的i部分代入表达式?求确认及替代方案
关于data.table[i, j, by]的i部分代入表达式的问题
你怀疑直接用字符串表达式+substitute的方式无法实现,这个判断是对的——你的示例报错正是因为substitute(exp1)并没有解析字符串里的筛选逻辑,只是返回了exp1这个符号,导致逻辑向量和符号做运算时类型不匹配。
下面是几种可行的替代方案:
方案1:将表达式定义为R表达式对象而非字符串
如果预设参数可以存储为R表达式(而非字符串),可以直接用eval调用:
library(data.table) dt = data.table( y = rep(c('a','b'),5), x = 1:10 ) # 用expression定义表达式 exp1 = expression(x > 5) dt[y == "a" & eval(exp1)] # 或者用quote定义 exp1 = quote(x > 5) dt[y == "a" & eval(exp1)]
方案2:解析字符串表达式(适合Shiny中存储字符串的场景)
如果必须用字符串存储预设参数,可以通过parse()将字符串转为表达式,再用eval()执行:
exp1 = "x > 5" dt[y == "a" & eval(parse(text = exp1))]
注:如果是用户输入的动态内容,parse()存在安全风险,但你是用预设参数,所以无需担心。
方案3:组合完整筛选字符串(更灵活的多条件场景)
如果需要根据用户选择组合多个筛选条件,可以直接构造完整的筛选字符串,一次性解析执行:
# 假设根据用户选择组合条件 condition1 = "y == 'a'" condition2 = "x > 5" full_condition = paste(condition1, "&", condition2) dt[eval(parse(text = full_condition))]
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

