如何将any(diff(vec) < 0)写成管道?

How to write any(diff(vec) < 0) as a pipe?

提问人:LulY 提问时间:6/26/2023 最后编辑:LulY 更新时间:6/28/2023 访问量:82

问:

我有一个这样的向量 vec,我想检查向量中是否有任何步骤。我使用:vec <- c(1,4,5)

any(diff(vec) < 0)
# [1] FALSE

没有台阶。好。但是当我尝试在管道中使用此代码时,我得到一个 TRUE 和一个警告:

library(magrittr)
vec %>% diff() %>% any(. < 0)
# [1] TRUE
# Warning message:
# In any(., . < 0) : coercing argument of type 'double' to logical

如何正确地写成管道?any(diff(vec) < 0)

R magrittr

评论

0赞 GKi 6/26/2023
请参阅:五个 Magrittr 管道 %>%、%<>%、%$%、%!>% 和 %T>% 的区别和用例是什么? at 当 dot 嵌套时,lhs 仍放在第一位

答:

2赞 ThomasIsCoding 6/26/2023 #1

你可以试试

vec %>%
    diff() %>%
    `<`(0) %>%
    any()

vec %>%
    diff() %>%
    {
        . < 0
    } %>%
    any()

vec %>%
    {
        any(diff(.) < 0)
    }
1赞 PGSA 6/26/2023 #2

使用 Magrittr 管道:

vec %>% diff() %>% `<`(0) %>% any()
[1] FALSE

使用基管:

vec |> diff() |> {\(x)x < 0}() |> any()
[1] FALSE

有关详细信息,请参阅此处:https://stackoverflow.com/a/72474832/16730940

2赞 user2554330 6/26/2023 #3

您已经有几个解决方案,但没有解释。您的原始函数不起作用的原因是管道在嵌套函数调用中时处理方式不同。magrittr.

通过嵌套函数调用,我的意思是它不是作为管道目标的函数的参数。在 中,该函数是 ,它的参数是 ,它实际上是对函数的函数调用。因此,它位于“嵌套函数调用”中。.any(. < 0)any(). < 0<.

如果仅在嵌套函数调用中,它也会隐式用作第一个参数,因此代码.

x %>% any(. < 0)

被视为

any(x, x < 0)

为了抑制这种奇怪的行为,请将表达式放在大括号中,即您的示例将是

vec %>% diff() %>% { any(. < 0) }

评论

0赞 LulY 6/26/2023
这里的“嵌套函数调用”是什么意思?这似乎是在我的代码中造成麻烦的实际点。
0赞 user2554330 6/26/2023
我添加了一些解释。
1赞 jay.sf 6/26/2023 #4

基础

vec |> diff() |> base::`<`(0) |> any()
# [1] FALSE

马格里特

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)

评论

1赞 MrFlick 6/26/2023
如果全部导入,不妨使用,使事情更清楚。magrittrvec %>% diff %>% is_less_than(0) %>% any
0赞 jay.sf 6/28/2023
@MrFlick 感谢您分享您的 magrittr 知识,我已经包括在内了!