首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mapply()再现Map()的结果

用mapply()再现Map()的结果
EN

Stack Overflow用户
提问于 2014-08-15 01:31:52
回答 1查看 405关注 0票数 4

采取以下数据框架和矢量,

代码语言:javascript
复制
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来做这个

代码语言:javascript
复制
> Map(`*`, df, v)
$x
[1]  5 10 15

$y
[1] 40 50 60

$z
[1] 105 120 135 

现在,因为Map被定义为

代码语言:javascript
复制
> Map
function (f, ...) 
{
    f <- match.fun(f)
    mapply(FUN = f, ..., SIMPLIFY = FALSE)
}
<bytecode: 0x3950e00>
<environment: namespace:base>

通过下面对mapply的调用,我应该能够准确地再现上面的内容,这似乎是合乎逻辑的,但事实并非如此。

代码语言:javascript
复制
> mapply(`*`, df, v, simplify = FALSE)
# Error in .Primitive("*")(dots[[1L]][[1L]], dots[[2L]][[1L]],   
#   simplify = dots[[3L]][[1L]]) : operator needs one or two arguments

问题似乎在"*"的论点中,而这些论点是

代码语言:javascript
复制
> args("*")
function (e1, e2) 
NULL

因此,再试两次会产生类似的错误。

代码语言:javascript
复制
> 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

这里有什么问题?我如何才能(准确地)复制来自

代码语言:javascript
复制
Map(`*`, df, v)

mapply

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-15 01:36:33

注意Map调用

代码语言:javascript
复制
mapply(FUN = f, ..., SIMPLIFY = FALSE)

而非

代码语言:javascript
复制
mapply(FUN = f, ..., simplify = FALSE)

当然,R是区分大小写的。试一试

代码语言:javascript
复制
mapply(`*`, df, v, SIMPLIFY = FALSE)
# $x
# [1]  5 10 15
# 
# $y
# [1] 40 50 60
# 
# $z
# [1] 105 120 135

而不是。使用simplify = FALSE,它试图调用

代码语言:javascript
复制
`*`(df[[1]], v[1], simplify = FALSE)

这就是造成这一错误的原因。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25320044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档