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

标签 r

取以下数据框和向量,

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

假设我想乘以 dfv 的元素按列排列, 意思 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/

相关文章:

performance - 在没有 for 循环的情况下查找并替换每列中的第一个 NA

r - 使用 tidyr::expand 进行非标准评估

Python 数据在两个不同的数组中随机丢失。希望将这些组合起来形成一个数组

r - 按行平均而不考虑负值

r - 在 R 中的箱线图中将字符向量中的值显示为斜体标签

r - 将行添加到来自另一个数据框的数据框列表

r - R 中的多次重复(2 次、3 次、...)

r - ggplot : placing facet strips above axis title

按组将 NA 替换为 example()

r - 如何从 2 个或更多矩阵的所有可能组合创建矩阵?