R自定义函数ddes单独运行正常,管道调用报错求解决
管道调用自定义R函数的问题与解决方法
我编写了如下R函数:
library(tibble); library(dplyr); library(magrittr) ddes <- function(variable) { n = length(variable) median = median(variable) mean = mean(variable) sd = sd(variable) se = round(sqrt(var(variable) / length(variable)), 2) lower.95 = mean(variable) - (abs(qt(0.025, df = n - 1)) * se) upper.95 = mean(variable) + (abs(qt(0.025, df = n - 1)) * se) tibble(n, median, mean, sd, se, lower.95, upper.95) }
单独调用ddes(mtcars$mpg)时可正常返回结果:
# # A tibble: 1 × 7 # n median mean sd se lower.95 upper.95 # <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> # 1 32 19.2 20.1 6.03 1.07 17.9 22.3
但使用管道方式调用mtcars %>% ddes(mpg)时出现错误:Error in ddes(., mpg) : unused argument (mpg),以下是几种可行的解决方法:
方法1:修改函数适配tidyverse管道风格
调整函数结构,让它接受数据框和列名参数,借助tidy eval语法解析列:
ddes <- function(data, variable) { # 捕获列名表达式 variable <- enquo(variable) # 从数据框中提取对应列的向量 var_vec <- data %>% pull(!!variable) n = length(var_vec) median = median(var_vec) mean = mean(var_vec) sd = sd(var_vec) se = round(sqrt(var(var_vec) / n), 2) lower.95 = mean(var_vec) - (abs(qt(0.025, df = n - 1)) * se) upper.95 = mean(var_vec) + (abs(qt(0.025, df = n - 1)) * se) tibble(n, median, mean, sd, se, lower.95, upper.95) }
修改后即可直接用管道调用:
mtcars %>% ddes(mpg)
方法2:管道中先提取列向量
不修改原函数,用pull先从数据框中提取目标列的向量,再传入函数:
mtcars %>% pull(mpg) %>% ddes()
方法3:直接引用管道传递的数据框
保持原函数不变,调用时明确从管道传递的数据框(.代表)中提取列:
mtcars %>% ddes(.$mpg)
内容的提问来源于stack exchange,提问作者luciano
相关产品推荐
相关产品推荐

