使用mapply()从Map()重现结果

时间:2014-08-15 01:31:53

标签: r

采取以下数据框和向量,

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

1 个答案:

答案 0 :(得分:4)

请注意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)

这就是给出错误的原因。