【问题标题】:Vectorize() vs apply()向量化()与应用()
【发布时间】:2014-09-24 17:43:08
【问题描述】:

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)

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

【问题讨论】:

  • 嗯...您是否运行了自己的示例?我已经看到Vectorize 的一个问题...
  • 好吧,我想这开始回答我的问题了。在引擎盖下看起来Vectorize() 只是mapply() 的包装器。
  • 既然你的例子被mget()排除了,你能用更好的例子重写吗?

标签: r vectorization apply mapply


【解决方案1】:

Vectorize 只是mapply 的包装器。它只是为您提供的任何功能构建一个mapply 循环。因此,通常有比Vectorize() 更简单的方法,而明确的*apply 解决方案最终在计算上是等效的,或者可能更优越。

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

【讨论】:

    【解决方案2】:

    补充托马斯的答案。也许还有速度?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2020-08-03
      相关资源
      最近更新 更多