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

lpwwtiir  于 2023-06-27  发布在  其他
关注(0)|答案(4)|浏览(122)

我有一个像这样的向量vec,我想检查向量中是否有任何向下的步骤。我这样做使用:

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)写成管道?

5hcedyr0

5hcedyr01#

你已经有了一些解决方案,但没有解释。原始版本不起作用的原因是magrittr管道在嵌套函数调用中对.的处理方式不同。
通过嵌套函数调用,我的意思是.不是管道目标函数的参数。在any(. < 0)中,该函数是any(),其参数是. < 0,这实际上是对<函数的函数调用。因此.处于“嵌套函数调用”中。
如果.仅在嵌套函数调用中,则它也隐式地用作第一个参数,因此代码

x %>% any(. < 0)

被视为

any(x, x < 0)

要抑制这种奇怪的行为,请将表达式放在大括号中,即你的例子会是

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

4szc88ey2#

你可以试试

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

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

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

n6lpvg4x3#

使用magrittr管道:

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

使用基管:

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

查看更多信息:https://stackoverflow.com/a/72474832/16730940

g6ll5ycj

g6ll5ycj4#

基地

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

马格里特尔

library(magrittr)
vec %>% diff %>% `<`(0) %>% any
# [1] FALSE
  • 数据:*
vec <- c(1, 4, 5)

相关问题