You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:10:27