gpt4 book ai didi

r - 不急切评估其潜在输出的矢量化 if_else 或 case_when ?

转载 作者:行者123 更新时间:2023-12-02 09:04:31 25 4
gpt4 key购买 nike

dplyr具有矢量化条件 if_elsecase_when .

然而,这两者都急切地评估它们可能的输出( true/false 表示 if_elsecase_when 的公式的 RHS ):

suppressPackageStartupMessages({
library(dplyr)
})

if_else(c(T, T, T), print(1), print(2))
#> [1] 1
#> [1] 2
#> [1] 1 1 1

case_when(
c(T, T, T) ~ print(1),
c(F, F, F) ~ print(2)
)
#> [1] 1
#> [1] 2
#> [1] 1 1 1

创建于 2020-02-05 由 reprex package (v0.3.0)

在这里我们可以明显看到 false即使从未使用过案例,也会对其进行评估。我正在寻找一种方法来避免这种情况,因为我的

有没有不这样做的替代方案?

我知道,一种选择实际上是 base::ifelse :

ifelse(c(T, T, T), print(1), print(2))
#> [1] 1
#> [1] 1 1 1

然而 base::ifelse众所周知,效率低下,因此更好的替代方案会很好。话虽如此,我对 case_when 的替代品特别感兴趣。 ,当我需要使用 ifelse 链时,我经常使用它。 s。

我已经看过 data.table::fifelse ,但它遇到了同样的问题:

suppressPackageStartupMessages({
library(data.table)
})

fifelse(c(T, T, T), print(1), print(2))
#> [1] 1
#> [1] 2
#> [1] 1 1 1

那么, if_else 是否有替代方案?和 case_when哪个不急切地评估其未使用的案例?

最佳答案

如果安装了data.table的开发版您可以从 GitHub 使用 fcase类似于 dplyr::case_when但是懒惰的评估:

data.table::fcase(c(TRUE, TRUE, TRUE), print(1L), c(FALSE, FALSE, FALSE), print(2L))

[1] 1
[1] 1 1 1

关于r - 不急切评估其潜在输出的矢量化 if_else 或 case_when ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60079566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com