提问人:LulY 提问时间:6/26/2023 最后编辑:LulY 更新时间:6/28/2023 访问量:82
如何将any(diff(vec) < 0)写成管道?
How to write any(diff(vec) < 0) as a pipe?
问:
我有一个这样的向量 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)
答:
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
如果全部导入,不妨使用,使事情更清楚。magrittr
vec %>% diff %>% is_less_than(0) %>% any
0赞
jay.sf
6/28/2023
@MrFlick 感谢您分享您的 magrittr 知识,我已经包括在内了!
评论