gpt4 book ai didi

r - dplyr::if_else() 没有正确运行一个函数作为结果,而 base ifelse() 运行得很好。为什么?

转载 作者:行者123 更新时间:2023-12-04 04:16:59 26 4
gpt4 key购买 nike

我理解 dplyr::if_else() 和基础 ifelse() 之间的主要区别:前者在真假结果之间进行严格的类型检查。

但是我注意到另一个不同之处,我想知道这是预期的行为还是我只是做错了。

下面是一些简单的代码:

library(dplyr)

choose_number <- function() {
n <- readline("Choose a number between 1 and 4: ")
n <- as.integer(n)
if (between(n, 1, 4)) { return(n) }
else { return(NA_integer_) }
}

# base ifelse() - works perfectly
get_answer <- function(pick = FALSE, n = 2) {
n <- ifelse(pick, choose_number(), as.integer(n))
return(n)
}

# dplyr::if_else() - does not work in the same way
get_answer <- function(pick = FALSE, n = 2) {
n <- if_else(pick, choose_number(), as.integer(n))
return(n)
}

我希望 get_answer() 仅在 pick 参数为 TRUE 时调用 choose_number()。否则它应该只返回 n 的值。它与上面代码中的基础 ifelse() 完美地做到了这一点,但不是 dplyr 版本。

但是,dplyr 版本不会返回错误或警告;它仍然调用 choose_number() 但忽略结果并只返回默认值 n

if_elsetrue 选项,choose_number() 将返回一个整数,false 也是如此选项。所以在我看来,应该满足 if_else 的类型检查功能。

最佳答案

原因是因为dplyr::if_else()ifelse()更严格。

dplyr::if_else() 在执行之前需要检查 truefalse 是相同的类型和类.由于 choose_number() 是一个函数,它需要先解析才能进行此类检查,因此即使您的 condition 为 FALSE,它也会运行。

更多信息在这里: https://rdrr.io/cran/dplyr/man/if_else.html

关于r - dplyr::if_else() 没有正确运行一个函数作为结果,而 base ifelse() 运行得很好。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60555268/

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