作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不清楚参数何时可以在 pmap() 和 pwalk() 的 .l
中显式配对。争论。有时,这些 purrr 函数似乎只在提供给它们的数据帧的名称直接映射到 .f
中命名的函数的预期参数时才起作用。 .其他时候,可以向 pmap() 提供完整的数据帧,并且可以显式地对变量进行映射。
library(dplyr)
library(purrr)
library(tibble)
set.seed(57)
ds_mt <-
mtcars %>%
rownames_to_column("model") %>%
mutate(am = factor(am, labels = c("auto", "manual"))) %>%
select(model, mpg, wt, cyl, am) %>%
sample_n(3)
foo <- function(model, am, mpg){
print(
paste("The", model, "has a", am, "transmission and gets", mpg, "mpgs.")
)
}
ds_mt %>%
select(model, am, mpg) %>%
pwalk(
.l = .,
.f = foo
)
# example with explicit pair mapping
ds_mt %>%
mutate(
new_var =
pmap(
.l = list(model=model, am=am, mpg=mpg),
.f = foo
)
)
ds_mt %>%
pwalk(
.l = list(model, am, mpg),
.f = foo
)
ds_mt %>%
pwalk(
.l = list(model=model, am=am, mpg=mpg),
.f = foo
)
最佳答案
你的问题与pmap()
无关或 pwalk()
.它源于对管道和 mutate()
的一些误解。功能工作。
一、管道:
除非用点另有说明,否则管道将左侧 (LHS) 作为右侧 (RHS) 函数的第一个参数传递。
所以这有效:
ds_mt %>%
select(model, am, mpg) %>%
pwalk(
.l = .,
.f = foo
)
因为您的列表(= 您的数据框,因为数据框是向量列表),它是管道的 LHS,被用作
pwalk()
的第一个参数在 RHS 上。
ds_mt %>%
select(model, am, mpg) %>%
pwalk(foo)
另一方面,当您尝试运行时:
ds_mt %>%
pwalk(
.l = list(model, am, mpg),
.f = foo
)
你的 LHS 和你的 RHS 之间的连接不遵循管道的规则,所以 R 不知道是什么
model
是因为您没有任何名为
model
的对象.
pwalk(
.l = list(ds_mt$model, ds_mt$am, ds_mt$mpg),
.f = foo
)
或者,如果你想使用管道,你必须用点替换管道的 LHS(因为它没有作为 RHS 上函数的第一个参数传递),这是代码工作所必需的,但是在这里,由于您在嵌套函数中传递 LHS,因此您还必须将 RHS 放在大括号之间,因为 R 否则会将 LHS 作为 RHS 最外层函数的第一个参数传递:
ds_mt %>% {
pwalk(
.l = list(.$model, .$am, .$mpg),
.f = foo
)
}
或者,以更紧凑的风格:
ds_mt %>% {pwalk(list(.$model, .$am, .$mpg), foo)}
总之,在管道的 LHS 上有一个对象让 R 神奇地将它应用到 RHS 的正确位置是不够的(但我认为您的困惑可能来自
dplyr
函数的情况(见下文) )。默认情况下,它用作 RHS 上函数的第一个参数(在这种情况下,您不需要任何点)。对于其他展示位置,您确实需要在需要 LHS 的每个地方都有一个点。在嵌套函数的情况下(如您在此处所使用的),您还需要将 RHS 括在花括号中,否则 R 会将 LHS 作为最外层 RHS 函数的第一个参数传递。
mutate()
例子:
ds_mt %>%
mutate(
new_var = pmap(
.l = list(model, am, mpg),
.f = foo
)
)
这个有效,因为使用较新版本的
dplyr
,在
mutate()
中调用变量时不再需要数据框和美元符号功能。所以在这里,R 并不奇怪
model
是因为您处于“变异框架”中,可以这么说,R 理解
model
作为含义
.$model
或
ds_mt$model
.所以在这里,这与
pmap()
无关。或
pwalk()
但是是
dplyr
的特殊性功能(与
summarise()
相同)。我猜这个符号的快捷方式是
dplyr
函数允许是什么导致你有些困惑。
foo()
接受 3 个参数,只要你保持参数的顺序正确,
foo(model = model, am = am, mpg = mpg)
和
foo(model, am, mpg)
完全一样。但是,如果您交换参数,则确实需要明确。例如:
foo(am = am, model = model, mpg = mpg)
关于r - 在 pmap() 或 pwalk() 中为 .l 提供列表参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53493735/
我不清楚参数何时可以在 pmap() 和 pwalk() 的 .l 中显式配对。争论。有时,这些 purrr 函数似乎只在提供给它们的数据帧的名称直接映射到 .f 中命名的函数的预期参数时才起作用。
我想做什么 我想遍历一个tibble并创建多个observeEvents。我在下面有一个可重现的例子。注释掉的代码有效,但我想用 pwalk 以编程方式创建observeEvents。 基本上我试图完
我是一名优秀的程序员,十分优秀!