取以下数据框和向量,

df <- data.frame(x = 1:3, y = 4:6, z = 7:9)
v <- c(5, 10, 15)

假设我想将 df 逐列乘以 v 的元素,即 df[1] * v[1]df[2] * v[2]df[3] * v[3]
我可以用 Map 做到这一点
> Map(`*`, df, v)
$x
[1]  5 10 15

$y
[1] 40 50 60

$z
[1] 105 120 135

现在,由于 Map 被定义为
> Map
function (f, ...)
{
    f <- match.fun(f)
    mapply(FUN = f, ..., SIMPLIFY = FALSE)
}
<bytecode: 0x3950e00>
<environment: namespace:base>

我应该能够通过以下对 mapply 的调用完全重现上述内容似乎合乎逻辑,但事实并非如此。
> mapply(`*`, df, v, simplify = FALSE)
# Error in .Primitive("*")(dots[[1L]][[1L]], dots[[2L]][[1L]],
#   simplify = dots[[3L]][[1L]]) : operator needs one or two arguments

问题似乎在 "*" 的参数之内,而这些参数是
> args("*")
function (e1, e2)
NULL

因此,再尝试两次会产生类似的错误。
> mapply(`*`, e1 = df, e2 = v, simplify = FALSE)
# Error in .Primitive("*")(e1 = dots[[1L]][[1L]], e2 = dots[[2L]][[1L]],  :
#   operator needs one or two arguments
> mapply(`*`, ..1 = df, ..2 = v, simplify = FALSE)
# Error in .Primitive("*")(..1 = dots[[1L]][[1L]], ..2 = dots[[2L]][[1L]],  :
#   operator needs one or two arguments

这里有什么问题?我怎样才能(准确地)复制结果
Map(`*`, df, v)

mapply

最佳答案

注意 Map 调用

mapply(FUN = f, ..., SIMPLIFY = FALSE)

不是
mapply(FUN = f, ..., simplify = FALSE)

当然 R 是区分大小写的。尝试
mapply(`*`, df, v, SIMPLIFY = FALSE)
# $x
# [1]  5 10 15
#
# $y
# [1] 40 50 60
#
# $z
# [1] 105 120 135

反而。使用 simplify = FALSE ,它试图调用
`*`(df[[1]], v[1], simplify = FALSE)

这就是导致该错误的原因。

关于使用 mapply() 从 Map() 再现结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25320044/

10-12 17:21
查看更多