我想向量化一个依赖于检查条件的函数,并根据该条件是TRUE还是FALSE,分别返回两个函数之一的结果。问题在于,当条件为FALSE时,无法评估第一个函数。然后,ifelse返回正确的值,但也会产生警告。我想产生一个不会产生警告的函数。
我已经尝试过ifelse()
,但是它不起作用。我期望当条件为FALSE时,此命令将跳过对第一个函数的求值。
这是R代码的说明部分
p = c(-1,1,-1,1,-1,-1,-1,1)
ifelse(p>0, sqrt(p), p^2)
返回
[1] 1 1 1 1 1 1 1 1
Warning message:
In sqrt(p) : NaNs produced
如您所见,结果是正确的,但是由于某种原因,当条件为FALSE时,它将在第一个函数处评估该函数。因此,我想以某种方式避免这个问题。
答案 0 :(得分:3)
可能无法通过ifelse
进行回避。我对ifelse
流程的理解是
yes
中的表达式创建值的向量no
中的表达式创建值的向量test
的结果来确定每个元素是来自yes
还是no
。如果yes
或no
中发生错误,则ifelse
将失败。
要解决此问题,您只需评估表达式将成功的位置。 (例如akrun的答案,为完整起见,此处给出了其变体)
p = c(-1,1,-1,1,-1,-1,-1,1)
condition <- p > 0
result <- numeric(length(p))
result[g1] <- sqrt(p[condition])
result[!g1] <- p[condition]^2
答案 1 :(得分:2)
我们可以创建一个numeric
向量,然后根据'p'提出的条件填充元素
out <- numeric(length(p))
out[p > 0] <- sqrt(p[p > 0])
out[p <= 0] <- p[p <= 0]^2
对于ifelse
,我们需要具有相同length
的所有参数。根据{{1}}
ifelse(测试,是,否)
具有相同长度和属性(包括尺寸和 “ class”)作为测试值和来自yes或no值的数据值
发生的事情是我们对整个向量都进行了计算,并根据?ifelse
条件替换了'p'的值。对于test
,负值肯定会发出警告,并输出为sqrt
。尽管NaN
元素未显示在输出中,但警告已被打印。该警告是一种友好的警告,但可以使用NaN