为什么意味着不在Reduce工作?

时间:2016-02-23 14:33:14

标签: r

Hadley Wickham的书 Advanced R 中有两个函数Reduce()的例子。两者都运作良好。

Reduce(`+`, 1:3) # -> ((1 + 2) + 3)
Reduce(sum, 1:3) # -> sum(sum(1, 2), 3)

但是,在mean中使用Reduce()时,它不会遵循相同的模式。结果始终是列表的第一个元素。

> Reduce(mean, 1:3)
[1] 1

> Reduce(mean, 4:2)
[1] 4

两个函数sum()mean()非常相似。为什么一个用Reduce()可以正常工作,但另一个没用?如果函数在Reduce()中出现错误结果之前,我怎么知道函数是否正常?

1 个答案:

答案 0 :(得分:7)

这与以下事实有关:与sum+不同,mean需要单个参数(re:值向量),因此不能应用于Reduce运作的方式,即:

  

Reduce使用二进制函数来连续组合元素   给定的向量和可能给定的初始值。

记下mean的签名:

mean(x, ...)

当您向其传递多个值时,该函数会将x与第一个值匹配,而忽略其余值。例如,当您致电Reduce(mean, 1:3)时,这或多或少会发生什么:

mean(1, 2)
#[1] 1

mean(mean(1, 2), 3)
#[1] 1

将此与sum的行为进行比较,sum(1, 2) #[1] 3 sum(sum(1, 2), 3) #[1] 6 接受可变数量的值:

byte[] passwd = Base64Util.decode(pwd);
bais = new ByteArrayInputStream(passwd);
baos = new ByteArrayOutputStream();
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, key);
// Read bytes, decrypt, and write them out.
byte[] buffer = new byte[2048];
int bytesRead;
while ((bytesRead = bais.read(buffer)) != -1) {
    out.write(cipher.update(buffer, 0, bytesRead));
}
// Write out the final bunch of decrypted bytes
out.write(cipher.doFinal());
out.flush();