在llply()中嵌入llply()以匹配列表中的对象的最佳替代方法?

时间:2014-01-03 04:07:28

标签: r list optimization plyr

我正在R中编写一个路径查找器,它找到从一个节点列表(表示为节点对象)到另一个节点列表(表示为节点对象)的所有路径(在n个距离处)。为了加速路径发现,我在两个方向上构建路径。然后,作为最后一步,我检查节点是否相交。

简而言之,我正在针对另一个节点列表运行一个节点列表,寻找所有匹配。但是,代码有效,运行速度非常慢。有没有人对如何重新编写此代码以获得更好的优化有任何建议?

unlist(llply(list.nodepath.1,
             # For each node.1 in list.nodepath.1...
             function(node.1){
               llply(list.nodepath.2,
                     # And for each node.2 in list.nodepath.2...
                     function(node.2){
                       if(node.1@internode == node.2@internode){
                         cat("Connection found!...\n")
                         # Merge node objects, including meta-data (defined elsewhere)
                         intersect(node.1, node.2)
                       }
                     })
              })
        )

我尝试过并行化;但是,我似乎无法使用llply(.parallel = TRUE)来处理这个函数......

根据Rprof()性能分析,瓶颈似乎与llply()调用有关 - 而不是与intersect()函数有关。

我很欣赏有关重组此代码的任何建议。

2 个答案:

答案 0 :(得分:1)

你看过TSP包吗?你的问题看起来像是那里遇到的问题的变种;其使用的一个例子如下:

> ## load library and read data
R> library("TSP")
R> data("USCA312")

R> ## create a TSP object from the data 
R> tsp <- TSP(USCA312)
R> tsp

object of class 'TSP'
312 cities (distance   'euclidean')

R> ## find a 2-optimal solution 
R> tour <- solve_TSP(tsp, method = "2-opt")
R> tour

答案 1 :(得分:0)

您可能会发现简单地使用lapply()比llply()更有效。例如,

L1 <- as.list(letters)
L2 <- list("f", "h", "k", "m")

unlist(lapply(L1, function(l) {
  lapply(L2, function(m) {
    if (l == m) {
      print("match found")
      return(m)
    }
  })
}))