对“ ifelse”的困惑

时间:2019-02-26 14:04:10

标签: r

ifelse令人困惑。我希望有人可以帮助解释。
考虑以下代码:

x1 = c(1,4,3)
y1 = c(2,3,5)
# 1
> ifelse(x1 > y1, x1^2 + y1^2,y1)
[1]  2 25  5

# 2
> ifelse(x1 > y1, sum(x1),y1)
[1] 2 8 5
# from #1 I guess second element should be sum(x1) == sum(x1[2]) == sum(4)  

为什么?
更新:
看完《 R编程的艺术》一书后,我解决了我的问题。

  

ifelse(b,u,v),其中b是布尔向量,而uv是向量。   返回值本身就是一个向量。如果i为true,则元素u[i]b[i];如果v[i]为false,则元素b[i]

所以

ifelse(x1 > y1, sum(x1),y1) == ifelse(x1 > y1, c(sum(x1),sum(x1),sum(x1)),c(2,3,5))  # by recycling
# then b = c(T,F,T), u = c(8,8,8), v = c(2,3,5)
# therefore output would be (v[1],u[2],v[3]), i.e.
# [1] 2 8 5

1 个答案:

答案 0 :(得分:1)

sum(x1)=8很明显,因为1 + 4 + 3 = 8。现在您可能想知道为什么ifelse似乎对表达式的计算方式不同:不是,只是^2不能应用于向量(向量平方)是什么,所以它在元素上应用明智。不过,您可以将sum()应用于向量,这会在第二次评估中发生。尝试ifelse(x1 > y1, x1,y1)