gpt4 book ai didi

r - 即使满足测试条件,ifelse 也会基于 else 函数显示警告

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

我有一个向量。例如,

a = c(5,-5)

我想根据是否为 ​​a>0 对 a 的值执行不同的功能

为简单起见,假设函数如下

output = ifelse(a>0, log(1+a), 0)

此代码在输出中返回所需的值等于

1.791759 0.000000

但是,它也显示警告:

Warning message:
In log(1+a) : NaNs produced

我希望有人能够解释为什么显示此警告,尽管事实上 log(1+a) 只会在 a>0 时被调用(不会产生 NaN)。这是 ifelse 的怪癖还是我做错了什么。

我还会注意到,当 a 的两个元素都小于 0 时,不会出现此警告(例如 a=c(-5,-5))

最佳答案

ifelse 的实现很奇怪。

如果我们查看函数,我们可以看到负责实际输出的部分:

> ifelse
function (test, yes, no)
{
if (is.atomic(test)) {
if (typeof(test) != "logical")
storage.mode(test) <- "logical"
if (length(test) == 1 && is.null(attributes(test))) {
if (is.na(test))
return(NA)
else if (test) {
if (length(yes) == 1 && is.null(attributes(yes)))
return(yes)
}
else if (length(no) == 1 && is.null(attributes(no)))
return(no)
}
}
else test <- if (isS4(test))
methods::as(test, "logical")
else as.logical(test)
ans <- test
ok <- !(nas <- is.na(test))
if (any(test[ok]))
ans[test & ok] <- rep(yes, length.out = length(ans))[test &
ok]
if (any(!test[ok]))
ans[!test & ok] <- rep(no, length.out = length(ans))[!test &
ok]
ans[nas] <- NA
ans
}

这是相关部分:

    ans <- test
ok <- !(nas <- is.na(test))
if (any(test[ok]))
ans[test & ok] <- rep(yes, length.out = length(ans))[test &
ok]
if (any(!test[ok]))
ans[!test & ok] <- rep(no, length.out = length(ans))[!test &
ok]
ans[nas] <- NA
ans

test 的 bool 结果存储在 ans 中。然后是一些检查是否有na的结果,这里无关紧要。然后根据 bool 值创建结果向量。但是看看完成的方式。

对于 TRUE 结果:

ans[test & ok] <- rep(yes, length.out = length(ans))[test & ok]

yes 被评估和重复,以便它匹配输出长度,然后子集化以获取在测试中为 TRUE 的项目。

警告的产生点就在这里。 ifelse 会评估 log(-5 + 1),生成警告,但随后将其从结果中排除,因为 test = FALSE

请注意,如果所有条目都是FALSE,if 语句if (any(test[ok])) 会阻止该部分的执行,因此不存在求值yes 参数并且没有警告。

关于r - 即使满足测试条件,ifelse 也会基于 else 函数显示警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097468/

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