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()
成为更好的选择?
Vectorize
只是mapply
的包装。它只是为你提供的任何功能构建一个mapply
循环。因此,通常比Vectorize()
更容易做的事情和明确的*apply
解决方案最终在计算上等同或可能更优越。
另外,对于你的具体例子,你听说过mget
,对吗?
添加托马斯的答案。也许速度?
# 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)