是否有必要使用“。” purr map()函数中的符号

时间:2018-11-30 16:37:34

标签: r

尝试从使用“ |”的文本文件中读取推文时作为分隔符,以下两个代码段给出了看似相似的结果:

bbc <- stringi::stri_read_lines(".../bbchealth.txt", 
                                     encoding = "auto") %>%
  map(str_split_fixed, "\\|", 3) %>%
  map_df(as_tibble)

bbc <- stringi::stri_read_lines(".../bbchealth.txt", 
                                     encoding = "auto") %>%
  map(., str_split_fixed, "\\|", 3) %>%
  map_df(., as_tibble)

我的问题是“。”是否在后一种情况下的两个映射函数中,是否有必要传递一个列表或矢量来表示符号?

2 个答案:

答案 0 :(得分:2)

使用管道%>%时,右侧表达式的第一个参数是左侧表达式的结果。如果不应该将LHS表达式作为第一个表达式,则可以使用.来绕过它,以指示LHS表达式应该去哪里。例如:

a<-1
a %>% paste("3")
[1] "1 3"
a %>% paste("3",.)
[1] "3 1"

这与某些函数无关,这些函数的第一个参数不是数据(例如,base :: Reduce),或者您要在表达式的其他位置使用LHS的结果,如上例所示。 / p>

因此,如果LHS应该是RHS表达式中的第一个参数,则不需要.

BTW-如果出于某种原因您想在RHS表达式中多次使用LHS,也可以使用.

a %>% paste(.,"3",.)
[1] "1 3 1"

或者,一个更现实的示例:

a %>% ifelse(.==1,3,.)
[1] 3
a %>% ifelse(.!=1,3,.)
[1] 1

(而且,如您所见,您还可以使用.创建布尔条件)。

答案 1 :(得分:1)

正如OP所述,两组代码块给出的结果相同,因为它知道输入是从%>%的lhs中传递出来的。但是,在某些情况下,我们可能需要明确指定.。假设我们在一条链中有一条print语句,那么如果不指定.可能会造成问题

bbc <- stringi::stri_read_lines(".../bbchealth.txt", 
                                 encoding = "auto") %>%
 {print("hello")
  map(., str_split_fixed, "\\|", 3)} %>%
  map_df(as_tibble)