R 避免循环但保留索引信息

R 避免循环但保留索引信息,r,R,我正在处理一些类似图形的数据,这些数据主要收集在向量或列表中。 大多数时候,我需要通过给定的索引检查向量/列表,并执行一些逻辑来确定当前元素的结果值 更精确一点,考虑这样一个代码片段: for (i in 1:(length1 - 1)) for (j in (i + 1):length2) for (k in 1:length3) { d1 <- data[i, k] d2 <- data[j, k]

我正在处理一些类似图形的数据,这些数据主要收集在向量或列表中。
大多数时候,我需要通过给定的索引检查向量/列表,并执行一些逻辑来确定当前元素的结果值

更精确一点,考虑这样一个代码片段:

for (i in 1:(length1 - 1))
    for (j in (i + 1):length2)
        for (k in 1:length3) {
            d1 <- data[i, k]
            d2 <- data[j, k]
            if (d1 != d2)
                otherData[i, j, k] <- list(c(min(d1, d2), max(d1, d2)))
            else
                otherData[i, j, k] <- list(c(1, 1))
        }
for(i in 1:(长度1-1))
对于(j英寸(i+1):长度2)
用于(k in 1:长度3){

d1好的,你可以做矢量化索引,这会给你一个显著加速的机会。一般来说,不是:

for(a in A) for(b in B) something(x[a,b])
你可以做:

something_vectorized(x[as.matrix(expand.grid(A,B))])
*apply基本上是循环包装器,所以通过将循环转换为它们,您将获得最多清晰的代码

编辑:补充注释的小插图:

> system.time(replicate(100,sum(sapply(1:1000,function(x) x^2))))
   user  system elapsed 
  0.385   0.001   0.388 
> system.time(replicate(100,sum((1:1000)^2)))
   user  system elapsed 
  0.002   0.001   0.003

这是你计算中的瓶颈吗?我的经验法则是-如果它适用于for/while循环(而你没有大数据),循环很好,很漂亮。有可能得到一个小的可复制的例子吗?我还没有进入性能测量阶段。我更想设计R型而不是一直循环。一旦我适应了正确的思维框架,我可能会提出矢量化的解决方案,而不首先考虑循环。这就是为什么我被问到的原因ing。不幸的是,我现在无法提供任何可复制的示例-我正在考虑一些一般性提示,而不是解决一个给定的问题:)感谢您的回答。感谢您的提示。我将尝试使用这种方法。有一件事让我想知道-您说*apply最多可以清除我的代码-这是否意味着使用*apply当我尝试使用R的功能来使用多核时,不会有任何提升吗?@chemical您必须考虑解释R代码的开销,这可能非常重要。R被用来做向量运算,所以做标量运算是非常不理想的;您可能会因此而得到20-30倍的减速,在这方面没有并行性的帮助。使用apply将帮助您在并行计算代码和单线程代码之间进行切换。这并不意味着您将获得性能提升(许多因素正在影响这一点,请参阅mbq的评论)。谢谢你对矢量化的精彩解释,它促进了我对R的理解:)然而,我仍然想不出一种矢量化的方法来加速我在问题中发布的一堆代码。它在列表上运行。我应该提供更多的代码吗?也许通过解决这个问题,你可以向我展示一种比n个循环。
> system.time(replicate(100,sum(sapply(1:1000,function(x) x^2))))
   user  system elapsed 
  0.385   0.001   0.388 
> system.time(replicate(100,sum((1:1000)^2)))
   user  system elapsed 
  0.002   0.001   0.003