R自定义函数调用报Join columns must be present in data错误如何解决?
问题根源
你遇到的报错本质是R中$运算符的取值逻辑和tidyverse非标准求值规则冲突导致的:
- 函数前半段dplyr管道中使用
{{ }}(curly-curly语法)解析传入的裸列名是正确的 - 但后面
CMHtest对应的代码行中,data$column1/data$column2/data$column3的写法错误:$运算符会将后面的标识符当做字面列名去数据集中匹配,而非解析为你传入的函数参数。你的原始数据集里不存在名为column1/column2/column3的列,因此触发取值错误,同时影响了前面管道中complete函数的列解析逻辑,最终抛出Join列不存在的报错。 - 当你把函数参数名改为var1-var3后,
data$var1刚好匹配到数据集里真实存在的列名,因此可以正常运行,不属于异常现象。
修正方案
将CMHtest行的列取值改为适配函数参数的动态取值方式即可,修正后的完整函数代码如下:
library(tidyverse) library(vcdExtra) var1<-c(rep("A",4),rep("B",4)) var2<-c(rep("C",4),rep("D",4)) var3<-c(rep("E",2),rep("F",4),rep("G",2)) dataset<-data.frame(var1,var2,var3) Rfun<-function(data,column1,column2,column3){ # 先将传入的列名quosure转为字符串,用于基础R取值 col1 <- rlang::as_name(rlang::enquo(column1)) col2 <- rlang::as_name(rlang::enquo(column2)) col3 <- rlang::as_name(rlang::enquo(column3)) data_<-data %>% dplyr::mutate(n = 1, {{column3}} := str_c('column3_', {{column3}})) %>% complete({{column1}}, {{column2}}, {{column3}}, fill = list(n = 0)) %>% pivot_wider(names_from = {{column3}}, values_from = n, values_fn = sum) %>% mutate(Total = rowSums(across(where(is.numeric)))) %>% group_by({{column1}}) %>% mutate(across(starts_with('column3'), ~ case_when(. == 0 ~ '0(0%)', TRUE ~ sprintf('%d(%d%%)', ., 100 * mean(. != 0))))) %>% ungroup() test<-CMHtest(table(data[[col2]], data[[col3]], data[[col1]]),overall=TRUE) res_list<-list(data_ = data_, test = test) return(res_list) } # 测试调用 Rfun(dataset,var1,var2,var3)
注意:不要用
list作为变量名,list是R的基础函数名,重名会引发潜在冲突。
内容的提问来源于stack exchange,提问作者Ruser-lab9
相关产品推荐
相关产品推荐

