英文:
How to write any(diff(vec) < 0) as a pipe?
问题
你可以将 any(diff(vec) < 0) 写成管道操作如下:
vec %>%
diff() %>%
`<`(0) %>%
any()
这将产生相同的结果而避免警告。
英文:
I have a vector vec like this vec <- c(1,4,5) and I want to check whether there are any steps down in the vector. I do this using:
any(diff(vec) < 0)
# [1] FALSE
No steps down. Okay. But when I try to use this code in a pipe I get a TRUE and an warning:
library(magrittr)
vec %>% diff() %>% any(. < 0)
# [1] TRUE
# Warning message:
# In any(., . < 0) : coercing argument of type 'double' to logical
How to correctly write any(diff(vec) < 0) as a pipe?
答案1
得分: 2
你可以尝试:
vec %>%
diff() %>%
`<`(0) %>%
any()
或者
vec %>%
diff() %>%
{
. < 0
} %>%
any()
或者
vec %>%
{
any(diff(.) < 0)
}
英文:
You can try
vec %>%
diff() %>%
`<`(0) %>%
any()
or
vec %>%
diff() %>%
{
. < 0
} %>%
any()
or
vec %>%
{
any(diff(.) < 0)
}
答案2
得分: 2
你已经有一些解决方案了,但没有解释。原始代码无法正常工作的原因是magrittr管道在嵌套函数调用中对.的处理方式不同。
所谓嵌套函数调用是指.不是管道目标的函数的参数。在any(. < 0)中,该函数是any(),其参数是. < 0,实际上是对<函数的函数调用。因此,.位于“嵌套函数调用”中。
如果.只出现在嵌套函数调用中,它会被隐式地用作第一个参数,所以代码
x %>% any(. < 0)
等同于
any(x, x < 0)
为了抑制这种奇怪的行为,将表达式放在大括号中,即你的示例将变为
vec %>% diff() %>% { any(. < 0) }
英文:
You have a couple of solutions already, but no explanation. The reason your original didn't work is that magrittr pipes treat . differently when it is in a nested function call.
By nested function call, I mean that . is not an argument to the function that is the target of the pipe. In any(. < 0), that function is any(), and its argument is . < 0, which is actually a function call to the < function. So the . is in a "nested function call".
If . is only in a nested function call, it is implicitly used as the first argument as well, so the code
x %>% any(. < 0)
is treated as
any(x, x < 0)
To suppress this weird behaviour, put the expression in braces, i.e. your example would be
vec %>% diff() %>% { any(. < 0) }
答案3
得分: 1
使用magrittr管道:
vec %>% diff() %>% `<(0)` %>% any()
[1] FALSE
使用基本管道:
vec |> diff() |> {(x)x < 0}() |> any()
[1] FALSE
更多信息请参考这里:
https://stackoverflow.com/a/72474832/16730940
英文:
using magrittr pipes:
vec %>% diff() %>% `<`(0) %>% any()
[1] FALSE
Using base pipes:
vec |> diff() |> {\(x)x < 0}() |> any()
[1] FALSE
See here for more info:
https://stackoverflow.com/a/72474832/16730940
答案4
得分: 1
Base
vec |> diff() |> base::`<`(0) |> any()
# [1] FALSE
magrittr
library(magrittr)
vec %>% diff %>% `<`(0) %>% any
# [1] FALSE
或者,如 @MrFlick 建议的:
library(magrittr)
vec %>% diff %>% is_less_than(0) %>% any
# [1] FALSE
数据:
vec <- c(1, 4, 5)
英文:
Base
vec |> diff() |> base::`<`(0) |> any()
# [1] FALSE
magrittr
library(magrittr)
vec %>% diff %>% `<`(0) %>% any
# [1] FALSE
or, as suggested by @MrFlick
library(magrittr)
vec %>% diff %>% is_less_than(0) %>% any
# [1] FALSE
Data:
vec <- c(1, 4, 5)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论