我试图更好地使用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))
2条答案
按热度按时间vmjh9lq91#
从
?pmap
开始pmap(.l, .f, ..., .progress = FALSE)
.l
=〉一个向量列表。. l的长度决定了调用. f的参数个数。如果未命名,参数将按位置提供;如果已命名,参数将按名称提供。使用匿名函数从列表中按名称向
make_chart
提供参数(首选方式),或者使用公式语法按位置提供参数,或者,
pqwbnv8z2#
@shafee提供的另一个选项是将一个名为
list
的函数与函数参数的名称一起传递给pmap
,这样我们就不需要一个匿名函数,它只是将传递给pmap
的list
的名称Map到函数参数的名称。此外,至少从
ggplot2
的Angular 来看,创建循环的最佳实践是循环列名(并使用.data
代词),而不是向函数传递向量,实际上,这样做可以去掉xtitle
参数,并在绘图函数中用x
替换xtitle
。