在R语言中如何让存储为字符串的代码等效于直接键入运行?
问题根源
你直接将存储表达式的字符串传入数据框行索引位置时,R会将其识别为行名匹配规则,而非你预期的逻辑筛选表达式,你的测试数据没有对应名称的行,因此返回NA行。
解决方案
方案1:执行字符串表达式(满足你原需求)
你提到的parse+eval组合完全可以解决问题,你之前报错大概率是执行环境或者转义处理的问题,只需要在使用表达式时加一层解析执行即可,修改代码如下:
maf_list_select <- lapply(maf_list_context, function(x){ x[eval(parse(text = contextexpression)), ] })
parse(text = contextexpression)会将字符串内容解析为R可识别的表达式,eval()会在当前函数的环境中执行该表达式,可以正常获取到变量x,返回逻辑筛选向量。
方案2:更安全的简化实现(更推荐)
完全不需要拼接代码字符串,仅靠正则本身的多模式匹配规则就能实现需求,既可以避免转义报错,也没有执行动态代码的安全风险:
# 拆分用户传入的多模式序列 contextvec <- unlist(str_split(context, pattern = ", ")) # 拼接为多分支正则,匹配任意一个规则就算命中 merged_pattern <- paste(contextvec, collapse = "|") # 直接筛选即可 maf_list_select <- lapply(maf_list_context, function(x){ x[str_detect(x$CONTEXT, pattern = merged_pattern), ] })
两种方案运行后得到的结果都和你手动粘贴表达式的运行结果完全一致。
内容的提问来源于stack exchange,提问作者pezrez
相关产品推荐
相关产品推荐

