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()
中出现错误结果之前,我怎么知道函数是否正常?
答案 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();