Vectorize()和apply()的区别

14

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

a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')

getv <- Vectorize(get)
getv(varnames)

对抗

sapply(varnames, get)

但是,在 Stack Overflow 上,我很少看到解决方案中使用 Vectorize() 的示例,仅使用 apply()(或其兄弟姐妹之一)。是否存在任何效率问题或其他合法的问题,使得 apply() 成为更好的选择,而不是使用 Vectorize()


1
嗯...你运行了自己的示例吗?我已经发现Vectorize存在一个问题了... - David Arenburg
好吧,我想这开始回答我的问题了。从底层来看,Vectorize()似乎只是mapply()的一个包装器。 - andrew
由于你的示例已经被“mget()”替代,你能否使用更好的示例进行重写? - smci
2个回答

15

Vectorize只是mapply的一个包装器。它只为您提供所需函数的mapply循环。因此,通常有比Vectorize()更简单的方法,显式的*apply解决方案最终具有计算等效性,甚至可能更优。

此外,针对您的具体示例,您听说过mget吗?


14
为了补充Thomas的回答,也许还需要考虑速度?
    # 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)

在此输入图片描述


mgetmgett的拼写错误。 - Timothy M Pollington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接