stat_function 与 R 中的循环冲突

stat_function conflict with loop in R

我有一个叫 join_boin 的 table。并且有 4 列。

list <- c("a", "b", "c", "d)

function <- function(a){
  
  for (i in list){
    table %>%
      ggplot(aes(!!as.name(i)))+
      geom_histogram(aes(y=amount)) +
  stat_function(fun = dnorm, args = list(mean = mean(table$a), sd = sd(table$a)))  -> result
    
    print(result)
  }
}

当我使用循环为 4 个变量的直方图创建分布时,我不知道如何处理 (mean = mean(table $ DIFFERENT VARIABLES) ...

而不是 $,使用 [[。在 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)

-输出