在R的咕噜声中,为什么pmap通过Error in FUN(X[[i]],...):明确定义.z时找不到对象“.z”?

c7rzv4ha  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(204)

我试图更好地使用pmap(),但我遇到了一些错误。在这个例子中,我有一个简单的图形函数,我想迭代它。我对pmap()的理解是,我可以设置和定义无限多个参数。然而,我很困惑,为什么我已经明确地定义了.z,它却说没有定义。
除非有必要,否则我对更改参数的任何定义方式都不感兴趣--我只想理解并解决为什么不能使用第三个参数,尽管.x和.y可以正常工作(即使我切换定义为.x、.y和.z的内容)。

library(purrr)
library(ggplot2)
library(dplyr)

#Plot function

make_chart <- function(data, x, y, xtitle){
  
  require(stringr)
    
  ggplot(data, aes(x = as.factor({{x}}), y = {{y}})) +
    geom_col() +
    ggtitle(paste0("Number of ", str_to_title({{xtitle}}), " by MPG")) +
    xlab({{xtitle}})
  
}

#Define x variables
x_variables <- c("cyl", "vs", "am", "gear", "carb")

#pmap it--why is .z not found and how do I get it to be?

pmap(list(.x = mtcars %>% dplyr::select(matches(x_variables)),
          .y = x_variables,
          .z = mtcars %>% dplyr::select(mpg)),
     ~mtcars %>%
       make_chart(x = .x, xtitle = .y, y = .z))
vmjh9lq9

vmjh9lq91#

?pmap开始
pmap(.l, .f, ..., .progress = FALSE)
.l =〉一个向量列表。. l的长度决定了调用. f的参数个数。如果未命名,参数将按位置提供;如果已命名,参数将按名称提供。
使用匿名函数从列表中按名称向make_chart提供参数(首选方式),或者使用公式语法按位置提供参数,

# using anonymous function to supply argument by name
pmap(.l = list(x = mtcars %>% dplyr::select(matches(x_variables)),
          y = x_variables,
          z = mtcars %>% dplyr::select(mpg)),
     .f = \(x, y, z) mtcars %>% make_chart(x = x, xtitle = y, y = z))

或者,

# supplying arguments by position
pmap(.l = list(mtcars %>% dplyr::select(matches(x_variables)),
          x_variables,
          mtcars %>% dplyr::select(mpg)),
     .f = ~ mtcars %>% make_chart(x = ..1, xtitle = ..2, y = ..3))
pqwbnv8z

pqwbnv8z2#

@shafee提供的另一个选项是将一个名为list的函数与函数参数的名称一起传递给pmap,这样我们就不需要一个匿名函数,它只是将传递给pmaplist的名称Map到函数参数的名称。
此外,至少从ggplot2的Angular 来看,创建循环的最佳实践是循环列名(并使用.data代词),而不是向函数传递向量,实际上,这样做可以去掉xtitle参数,并在绘图函数中用x替换xtitle

library(purrr)
library(ggplot2)
library(stringr)

make_chart <- function(data, x, y, xtitle) {
  ggplot(data, aes(x = as.factor(.data[[x]]), y = .data[[y]])) +
    geom_col() +
    ggtitle(paste0("Number of ", str_to_title(xtitle), " by MPG")) +
    xlab(xtitle)
}

x_variables <- c("cyl", "vs", "am", "gear", "carb")

pmap(
  list(
    x = x_variables,
    xtitle = x_variables,
    y = "mpg"
  ),
  make_chart,
  data = mtcars
)
#> [[1]]

#> 
#> [[2]]

相关问题