英文:
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)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论