【问题标题】:stat_function conflict with loop in Rstat_function与R中的循环冲突
【发布时间】:2021-08-19 01:29:15
【问题描述】:

我有一个名为 join_boin 的表。并且有 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) ...

【问题讨论】:

    标签: r loops ggplot2 histogram


    【解决方案1】:

    使用[[ 代替$。在 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)
    

    -输出

    【讨论】:

    • 嗨,它给了我一个错误:tbl_subset2(x,j = i,j_arg =替代(i))中的错误:找不到对象'av_total'。所以,也许我的问题是如何我在列表中更改了 join_boston$DIFFERENT 变量名谢谢!!!
    • @island1996 你怎么称呼它?你把函数称为functiona(list)
    • 我也尝试过使用 args = list(mean = mean(join_boston$list), sd = sd(join_boston$list)) 虽然它可以运行但不会给我任何干扰线
    • 我称之为函数
    • @island1996 你能试试第二个功能吗?它正在与 mtcars 合作
    猜你喜欢
    • 2023-03-04
    • 2018-05-19
    • 2021-10-31
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多