14

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

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

getv <- Vectorize(get)
getv(varnames)

对比

sapply(varnames, get)

但是,至少在 SO 我很少看到Vectorize()解决方案中的示例,只有apply()(或其中一个兄弟姐妹)。是否存在任何效率问题或其他合理的担忧,Vectorize()这是apply()一个更好的选择?

4

2 回答 2

15

Vectorize只是mapply. 它只是为您mapply提供的任何功能构建一个循环。因此,通常有比Vectorize()它更容易做的事情,并且显式*apply解决方案最终在计算上是等效的,或者可能是更好的。

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

于 2014-08-01T13:53:07.440 回答
12

To add to Thomas's answer. Maybe also speed?

    # 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)

enter image description here

于 2014-08-01T14:05:40.887 回答