使用[[ 代替$。在 OP 的代码中,传递给函数的参数是 av_total,而 for 循环使用在函数外部创建的 list 对象。应该和av_total一样(或者把参数改成'av_total_list')
functiona <- function(data, av_total_list){
for(av_total in av_total_list) {
data %>%
ggplot(aes(!!as.name(av_total)))+
geom_histogram(aes(y= ..density..), bins = 42) +
stat_function(fun = dnorm, colour = "red",
args = list(mean = mean(data[[av_total]]),
sd = sd(data[[av_total]]))) -> myresult
print(myresult)
}
}
并将其称为
functiona(join_boston, list)
可重现
vec <- c('mpg', 'disp', 'hp')
functiona(mtcars, vec)
上面的函数只是将print输出到控制台。相反,最好创建一个函数以 return 输出并循环 list 并应用该函数
library(dplyr)
library(ggplot2)
library(purrr)
functionb <- function(data, av_total) {
data %>%
ggplot(aes(.data[[av_total]])) +
geom_histogram(aes(y = ..density..), bins = 42) +
stat_function(fun = dnorm, colour = "red",
args = list(mean = mean(data[[av_total]], na.rm = TRUE),
sd = sd(data[[av_total]], na.rm = TRUE)))
}
在列名上循环调用函数
out <- map(list, ~ functionb(join_boston, .x))
作为可重现的测试示例
data(mtcars)
library(ggpubr)
vec <- c('mpg', 'disp', 'hp')
out <- map(vec, ~ functionb(mtcars, .x))
ggarrange(plotlist = out, ncol = 2, nrow = 2)
-输出