R 相当于 Python 的 heapq.heapify()?

R equivalent of Python's heapq.heapify()?

标题都说了。我正在寻找 Python 的 heapq.heapify() 的 R 等价物。我找不到它,但我希望它存在于某个地方。

heapq 是堆 queue 实现模块,其成员函数 heapify 接受 object 和 returns 堆 returns 的列表作为输入=24=] 包含对那些 object 作为堆成员的引用。

编辑:我不能使用 rPython 在 R 中调用 Python 代码,因为最终脚本将成为 Shiny 应用程序的一部分(它几乎不能与 rPython 一起使用,并且无论如何都不允许导入模块)。

我通过移植发现的 Matlab 代码创建了这个 heapify R 函数 here(这比从 Python 移植更容易,因为与 R 一样,Matlab 使用 1 索引基线)。

只需将一个未排序的向量传递给函数,并指定您要实现min-heapify还是max-heapify。我与Python的heapq.heapify()(默认为min-heapify)进行了比较,结果是一样的。

heapify = function(input_vector, min){

  # below is the maxheapify algorithm
  # minheapify = maxheapify with sign change at the beginning and at the end

  if (min==TRUE){input_vector = - input_vector}

    count = length(input_vector)

    start = floor(count/2)

    while (start >= 1){
      root = start
      theEnd = count

      while ((root * 2) <= theEnd){

        child = root * 2

        if ((child + 1 <= theEnd) & (input_vector[child] < input_vector[child+1])){
          child = child + 1
        }

        if (input_vector[root] < input_vector[child]){

          temp = input_vector[root]
          input_vector[root] = input_vector[child]
          input_vector[child] = temp

          root = child

        } else {
          break
        }

      }

        start = start - 1
    }

    if (min==TRUE){input_vector = - input_vector}

output = list(heap=input_vector)
}

示例:

在 R 中:

heapify(c(30,1,1,0,3,3,3,2,14,25,3,10,4,3),min=TRUE)$heap
[1]  0  1  1  2  3  3  3 30 14 25  3 10  4  3

在Python中:

test = [30,1,1,0,3,3,3,2,14,25,3,10,4,3]
heapq.heapify(test)
test
Out: [0, 1, 1, 2, 3, 3, 3, 30, 14, 25, 3, 10, 4, 3]