首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vectorize() vs apply()

Vectorize() vs apply()
EN

Stack Overflow用户
提问于 2014-08-01 13:40:38
回答 2查看 4.8K关注 0票数 14

通常可以使用Vectorize()R中的apply()函数来实现相同的目标。出于可读性的原因,我通常更喜欢将函数向量化,因为主调用函数与手头的任务有关,而sapply则不是。当我在R代码中多次使用这个矢量化函数时,它对Vectorize()也很有用。例如:

代码语言:javascript
运行
复制
a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')

getv <- Vectorize(get)
getv(varnames)

vs

代码语言:javascript
运行
复制
sapply(varnames, get)

但是,至少我很少在解决方案中看到Vectorize()的例子,只有apply() (或其中一个兄弟)。Vectorize()是否存在任何效率问题或其他合理的考虑,使apply()成为一个更好的选择?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-01 13:53:07

Vectorize只是mapply的包装器。它只为提供给它的任何函数构建一个mapply循环。因此,通常要做比Vectorize()更简单的事情,而显式的*apply解决方案最终在计算上是等价的,或者可能更优越。

另外,对于您的具体例子,您已经听说过mget,对吗?

票数 15
EN

Stack Overflow用户

发布于 2014-08-01 14:05:40

来补充托马斯的答案。也许也是速度?

代码语言:javascript
运行
复制
    # install.packages(c("microbenchmark", "stringr"), dependencies = TRUE)
require(microbenchmark)
require(stringr)

Vect <- function(x) { getv <- Vectorize(get); getv(x) }
sapp <- function(x) sapply(x, get)
mgett <- function(x) mget(x)
res <- microbenchmark(Vect(varnames), sapp(varnames), mget(varnames), times = 15)

## Print results:
print(res)
Unit: microseconds
           expr     min       lq  median       uq     max neval
 Vect(varnames) 106.752 110.3845 116.050 122.9030 246.934    15
 sapp(varnames)  31.731  33.8680  36.199  36.7810 100.712    15
 mget(varnames)   2.856   3.1930   3.732   4.1185  13.624    15


### Plot results:
boxplot(res)

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

https://stackoverflow.com/questions/25081604

复制
相关文章

相似问题

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