gpt4 book ai didi

r - 使用 %>% 管道和点 (.) 表示法

转载 作者:行者123 更新时间:2023-12-02 09:14:41 25 4
gpt4 key购买 nike

当使用map时在嵌套的 data_frame 上,我不明白为什么后两个版本会出错,我应该如何使用点( . )?

library(tidyverse)
# dummy data
df <- tibble(id = rep(1:10, each = 10),
val = runif(100))
df <- nest(df, -id)

# works as expected
map(df$data, min)
df %>% .$data %>% map(., min)

# gives an error
df %>% map(.$data, min)
# Error: Don't know how to index with object of type list at level 1

df %>% map(data, min)

最佳答案

问题不在于 map,而在于 %>% 管道如何处理 .。考虑以下示例(请记住 / 是 R 中的两个参数函数):

简单管道:

1 %>% `/`(2)

相当于 `/`(1, 2)1/2 并给出 0.5

它也相当于 1 %>% `/`(., 2)

简单的.使用:

1 %>% `/`(2, .)

相当于 `/`(2, 1)2/1 并给出 2

您可以看到 1 不再用作第一个参数,而仅用作第二个参数。

其他.使用:

但是,当对进行子集化时,这不起作用:

list(a = 1) %>% `/`(.$a, 2)
Error in `/`(., .$a, 2) : operator needs one or two arguments

我们可以看到 . 被注入(inject)两次,作为第一个参数并在第二个参数中子集化。像 .$a 这样的表达式有时被称为嵌套函数调用($ 函数在 / 函数,在本例中)。

我们使用大括号来避免第一个参数注入(inject):

list(a = 1) %>% { `/`(.$a, 2) }

再次给出 0.5。

实际问题:

您实际上是在调用 map(df, df$data, min),而不是 map(df$data, min)

解决方案:

使用大括号:

df %>% { map(.$data, min) }

另请参阅 ?magrittr::`%>%` 中的标题将点用于次要目的,内容如下:

In particular, if the placeholder is only used in a nested functioncall, lhs will also be placed as the first argument! The reason forthis is that in most use-cases this produces the most readable code.For example, iris %>% subset(1:nrow(.) %% 2 == 0) is equivalent toiris %>% subset(., 1:nrow(.) %% 2 == 0) but slightly more compact. Itis possible to overrule this behavior by enclosing the rhs in braces.For example, 1:10 %>% {c(min(.), max(.))} is equivalent toc(min(1:10), max(1:10)).

关于r - 使用 %>% 管道和点 (.) 表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com