R语言自定义函数如何传入字符串形式的mutate操作作为参数并执行?
原因说明
你之前的写法中,eval(parse(text = mutation))仅返回了计算后的数值结果,mutate无法识别到赋值语句左侧的列名,因此默认将整个函数调用作为新列名,才会出现多余的列、原有列未修改的问题。
解决方案
推荐使用rlang的表达式注入语法实现,代码如下:
library(rlang) library(dplyr) library(gapminder) update_mut <- function(df, mutation) { df %>% mutate(!!!parse_exprs(mutation)) }
parse_exprs()会将输入的字符串转换为表达式列表,!!!操作符会将表达式展开为mutate的原生参数,效果和你直接手动写mutate参数完全一致。
测试效果
运行如下代码即可得到预期结果:
res <- update_mut(gapminder, "year = 2*year")
得到的res和gapminder %>% mutate(year = 2*year)完全相同,原有year列被更新,无多余列。
多突变支持
该写法天然支持同时传入多个突变规则,用逗号分隔即可:
res <- update_mut(gapminder, "year = 2*year, pop = pop / 1000, gdpPercap = log(gdpPercap)")
注意事项
字符串转表达式执行存在代码注入风险,仅在你完全控制mutation参数输入来源的场景下使用。
内容的提问来源于stack exchange,提问作者FZS
相关产品推荐
相关产品推荐

