Vectorize()
中的apply()
和R
函数通常可用于实现相同的目标。出于可读性的原因,我通常更喜欢矢量化函数,因为主调用函数与手头的任务有关,而sapply
则不然。当我要在我的R代码中多次使用该向量化函数时,它对Vectorize()
也很有用。例如:
a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')
getv <- Vectorize(get)
getv(varnames)
VS
sapply(varnames, get)
但是,至少在SO上我很少在解决方案中看到Vectorize()
的示例,只有apply()
(或其中一个兄弟姐妹)。 Vectorize()
是否存在使apply()
成为更好选择的效率问题或其他合理问题?
答案 0 :(得分:13)
Vectorize
只是mapply
的包装器。它只是为你提供的任何函数构建mapply
循环。因此,通常比Vectorize()
更容易做事,明确的*apply
解决方案最终在计算上等同或可能更优越。
另外,对于您的具体示例,您听说过mget
,对吧?
答案 1 :(得分:11)
添加托马斯的答案。也许速度?
# 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)