修改rstatix包identify_outliers函数报错:找不到get_selected_vars函数
问题:自定义rstatix衍生函数时找不到
get_selected_vars函数 问题背景
我修改了rstatix包的identify_outliers函数,目的是让调用is_outlier时可以自定义系数。移除了原函数中is_extreme相关逻辑,新增参数y用于传递系数,命名为crazy_outliers,但运行时出现错误:找不到get_selected_vars函数。原函数中该函数可正常使用,尝试指定rstatix::get_selected_vars也无效,寻求解决办法。
原identify_outliers函数代码
function (data, ..., variable = NULL) { is.outlier <- NULL if (is_grouped_df(data)) { results <- data %>% doo(identify_outliers, ..., variable = variable) if (nrow(results) == 0) results <- as.data.frame(results) return(results) } if (!inherits(data, "data.frame")) stop("data should be a data frame") variable <- data %>% get_selected_vars(..., vars = variable) n.vars <- length(variable) if (n.vars > 1) stop("Specify only one variable") values <- data %>% pull(!!variable) results <- data %>% mutate(is.outlier = is_outlier(values), is.extreme = is_extreme(values)) %>% filter(is.outlier == TRUE) if (nrow(results) == 0) results <- as.data.frame(results) results }
自定义crazy_outliers函数代码
crazy_outliers <- function (data, ..., variable = NULL, y) #added y argument { is.outlier <- NULL if (is_grouped_df(data)) { results <- data %>% doo(crazy_outliers, ..., variable = variable, y = y) # changed identify_outliers to crazy_outliers and added y argument if (nrow(results) == 0) results <- as.data.frame(results) return(results) } if (!inherits(data, "data.frame")) stop("data should be a data frame") variable <- data %>% get_selected_vars(..., vars = variable) n.vars <- length(variable) if (n.vars > 1) stop("Specify only one variable") values <- data %>% pull(!!variable) results <- data %>% mutate(is.outlier = is_outlier(values, coef = y)) #Here I utilize the y argument to specify the coefficient for determining outliers if (nrow(results) == 0) results <- as.data.frame(results) results }
报错信息
Error in `mutate()`: ℹ In argument: `data = map(.data$data, .f, ...)`. Caused by error in `map()`: ℹ In index: 1. Caused by error in `get_selected_vars()`: ! could not find function "get_selected_vars"
解决办法
原因说明
get_selected_vars是rstatix包的内部非导出函数,只有包内的函数能直接调用,外部自定义函数无法通过常规方式访问,哪怕指定rstatix::前缀也不行——原函数能正常运行是因为它处于rstatix的命名空间内,有权限访问内部函数。
方案1:替换为公开函数(推荐)
用dplyr和rlang的公开函数实现相同的变量选择逻辑,避免依赖内部函数:
修改variable <- data %>% get_selected_vars(..., vars = variable)这一行,替换为:
# 提取选中的变量名 selected <- data %>% select(..., {{ variable }}) %>% colnames() # 转换为符号供dplyr使用 variable <- rlang::sym(selected)
修改后的完整crazy_outliers函数:
crazy_outliers <- function (data, ..., variable = NULL, y) { is.outlier <- NULL if (is_grouped_df(data)) { results <- data %>% doo(crazy_outliers, ..., variable = variable, y = y) if (nrow(results) == 0) results <- as.data.frame(results) return(results) } if (!inherits(data, "data.frame")) stop("data should be a data frame") # 替换原get_selected_vars逻辑 selected <- data %>% select(..., {{ variable }}) %>% colnames() variable <- rlang::sym(selected) n.vars <- length(variable) if (n.vars > 1) stop("Specify only one variable") values <- data %>% pull(!!variable) results <- data %>% mutate(is.outlier = is_outlier(values, coef = y)) if (nrow(results) == 0) results <- as.data.frame(results) results }
方案2:获取内部函数(不推荐,依赖包内部实现)
如果一定要沿用原逻辑,可以用getFromNamespace直接获取rstatix的内部函数,在函数开头添加:
get_selected_vars <- getFromNamespace("get_selected_vars", "rstatix")
但要注意:rstatix包更新时可能会修改或移除这个内部函数,导致代码失效,稳定性不如方案1。
内容的提问来源于stack exchange,提问作者Phaaltu Waaltu
相关产品推荐
相关产品推荐

