R语言函数调用时如何检测传入的未加引号列是否为numeric类型
R函数判断无引号传参的列是否为数值类型的正确写法
错误根因
你原有代码里的data$x是固定读取数据框中名为x的列,和你传入的参数x没有关联,因此永远无法匹配你传入的列名,导致逻辑失效。你之前尝试的{{x}}/!!x语法未生效是因为没有搭配正确的列取值逻辑。
两种可行实现
方案1:Base R实现(无需依赖第三方包)
通过substitute捕获未求值的列名,再转为字符串后用[[]]读取对应列:
fun_df <- function(data, x) { col_name <- deparse(substitute(x)) if (is.numeric(data[[col_name]])) { stop("done!") } print("did not pass") }
测试示例:
- 调用
fun_df(cars, dist):cars的dist列是数值类型,会触发stop输出done! - 调用
fun_df(iris, Species):iris的Species列是因子类型,会输出did not pass
方案2:tidy evaluation实现(适配tidyverse语法习惯)
用{{}}捕获列名后,搭配dplyr的pull()函数读取对应列:
library(dplyr) fun_df <- function(data, x) { target_col <- pull(data, {{ x }}) if (is.numeric(target_col)) { stop("done!") } print("did not pass") }
该方案完全支持你要求的无引号传参调用格式fun_df(cars, dist)。
内容的提问来源于stack exchange,提问作者yuliaUU
相关产品推荐
相关产品推荐

