R管道操作的自定义函数中传入列名参数实现mutate计算的方法
报错原因
你传入的var是字符串类型的列名,dplyr的tidy求值逻辑默认不会直接把字符串识别为数据框的列,直接在mutate()中写var * 100时,R会尝试对"Sepal.Width"这个字符串本身做乘法运算,自然抛出「非数值参数参与二元运算」的错误。
修复方法
适配字符串传参的写法(匹配你现有调用习惯)
如果你习惯传入带引号的列名字符串,用.data代词索引对应列即可,这是官方推荐的字符串列名注入方案:
var = "Sepal.Width" scale_fun2 = function(dat,var) { dat %>% dplyr::mutate(new_variable = .data[[var]] * 100) } scale_fun2(iris,var)
支持原生dplyr无引号传参的写法
如果你想和原生dplyr语法保持一致,调用时不需要给列名加引号,用双大括号{{ }}包裹参数即可:
scale_fun3 = function(dat,var) { dat %>% dplyr::mutate(new_variable = {{var}} * 100) } # 调用时直接写列名,不需要加引号 scale_fun3(iris, Sepal.Width)
旧版dplyr兼容写法
如果你的dplyr版本低于1.0.0,可以将字符串转为符号后解引用实现:
var = "Sepal.Width" scale_fun4 = function(dat,var) { var_sym = rlang::sym(var) dat %>% dplyr::mutate(new_variable = !!var_sym * 100) } scale_fun4(iris,var)
内容的提问来源于stack exchange,提问作者Dasr
相关产品推荐
相关产品推荐

