尝试从使用“ |”的文本文件中读取推文时作为分隔符,以下两个代码段给出了看似相似的结果:
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)
我的问题是“。”是否在后一种情况下的两个映射函数中,是否有必要传递一个列表或矢量来表示符号?
答案 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)