使用 magrittr pipe-forward 运算符传递参数两次
Passing an argument twice with magrittr pipe-forward operator
这是一个让我感到困扰的虚拟示例(在 vanilla
会话中):
library(magrittr)
"test" %>% is.na()
#[1] FALSE
"test" %>% nchar()>3
#[1] TRUE
"test" %>% is.na(.)
#[1] FALSE
"test" %>% nchar(.)>3
#[1] TRUE
"test" %>% is.na(.) || nchar(.)>3
#Error in nchar(.) : object '.' not found
目前我的理解是.
运算符(不知道运算符这个词是否准确,但我们就这样吧)只能用在pipe-forward之后调用的第一个函数中。
useless_function <- function(a, b, c) {
print(c(a,b,c))
return(FALSE)
}
"test" %>% useless_function(1, "a")
#[1] "test" "1" "a"
#[1] FALSE
"test" %>% useless_function(1, "a", .)
#[1] "1" "a" "test"
#[1] FALSE
"test" %>% useless_function(., ., "a")
#[1] "test" "test" "a"
#[1] FALSE
"test" %>% useless_function("a", ., useless_function(1, 2, .))
#[1] "1" "2" "test"
#[1] "a" "test" "FALSE"
#[1] FALSE
"test" %>% useless_function("a", ., useless_function(1, 2, .)) || useless_function(., "never", "here")
#[1] "1" "2" "test"
#[1] "a" "test" "FALSE"
#Error in print(c(a, b, c)) : object '.' not found
所以,我尝试使用 magrittr::or
函数:
> "test" %>% or(is.na(.), nchar(.)>3)
#Error in or(., is.na(.), nchar(.) > 3) :
# 3 arguments passed to '|' which requires 2
这几乎就是我被困的地方。
请注意,我知道一些解决此问题的方法。只是,其中 none 与正常的管道转发功能一样清晰。
("test" %>% is.na()) | ("test" %>% nchar()>3)
#[1] TRUE
"test" ->.; is.na(.) | nchar(.)>3 # Don't hit me, this one is just for fun
#[1] TRUE
使用{}
指定优先级,以便按照您想要的方式计算它们
library(magrittr)
"test" %>% {is.na(.) || nchar(.)>3}
#[1] TRUE
或者
"test" %>% {or(is.na(.), nchar(.)>3)}
这是一个让我感到困扰的虚拟示例(在 vanilla
会话中):
library(magrittr)
"test" %>% is.na()
#[1] FALSE
"test" %>% nchar()>3
#[1] TRUE
"test" %>% is.na(.)
#[1] FALSE
"test" %>% nchar(.)>3
#[1] TRUE
"test" %>% is.na(.) || nchar(.)>3
#Error in nchar(.) : object '.' not found
目前我的理解是.
运算符(不知道运算符这个词是否准确,但我们就这样吧)只能用在pipe-forward之后调用的第一个函数中。
useless_function <- function(a, b, c) {
print(c(a,b,c))
return(FALSE)
}
"test" %>% useless_function(1, "a")
#[1] "test" "1" "a"
#[1] FALSE
"test" %>% useless_function(1, "a", .)
#[1] "1" "a" "test"
#[1] FALSE
"test" %>% useless_function(., ., "a")
#[1] "test" "test" "a"
#[1] FALSE
"test" %>% useless_function("a", ., useless_function(1, 2, .))
#[1] "1" "2" "test"
#[1] "a" "test" "FALSE"
#[1] FALSE
"test" %>% useless_function("a", ., useless_function(1, 2, .)) || useless_function(., "never", "here")
#[1] "1" "2" "test"
#[1] "a" "test" "FALSE"
#Error in print(c(a, b, c)) : object '.' not found
所以,我尝试使用 magrittr::or
函数:
> "test" %>% or(is.na(.), nchar(.)>3)
#Error in or(., is.na(.), nchar(.) > 3) :
# 3 arguments passed to '|' which requires 2
这几乎就是我被困的地方。
请注意,我知道一些解决此问题的方法。只是,其中 none 与正常的管道转发功能一样清晰。
("test" %>% is.na()) | ("test" %>% nchar()>3)
#[1] TRUE
"test" ->.; is.na(.) | nchar(.)>3 # Don't hit me, this one is just for fun
#[1] TRUE
使用{}
指定优先级,以便按照您想要的方式计算它们
library(magrittr)
"test" %>% {is.na(.) || nchar(.)>3}
#[1] TRUE
或者
"test" %>% {or(is.na(.), nchar(.)>3)}