采取以下数据框和向量,
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
?
答案 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)
这就是给出错误的原因。