繁体   English   中英

R向量在递归函数中建立索引后保持相同的长度

[英]R vector staying the same length after indexing within recursive function

我在R中编写了一个递归二进制搜索函数,该函数查找向量中大于给定值的最小元素:

binary_next_biggest <- function(x, vec){
  if (length(vec) == 1){
    if (x < vec[1]){
      return(vec[1])
    } else {
      return(NA)
    }
  } else {
    mid = ceiling(length(vec)/2)
    if (x < vec[mid]){
      return(binary_next_biggest(x, vec[1:mid]))
    } else {
      return(binary_next_biggest(x, vec[mid+1:length(vec)]))
    }
  }
}

我已经用Python编写了这个完全相同的函数,没有任何问题(下面的代码),但是在R中它不起作用。

import numpy as np

def binary_next_biggest(x, arr):
    if len(arr)==1:
        if x < arr[0]:
            return arr[0]
        else:
            return None
    else:
        mid = int(np.ceil(len(arr)/2)-1)
        if x < arr[mid]:
            return binary_next_biggest(x, arr[:mid+1])
        else:
            return binary_next_biggest(x, arr[mid+1:])

通过在RStudio中进行调试,我发现了为什么它不起作用的机理:在我上面的函数中对向量进行索引将返回相同长度的向量,因此

vec <- 1:10

vec在函数中建立了索引,

vec[6:10]

传递给binary_next_biggest()新调用的结果向量为

6 7 8 9 10 NA NA NA NA NA

我期望的地方

6 7 8 9 10

这里发生了什么? 我知道我可以将它重写为一个while循环迭代更改索引,但是我不明白为什么矢量索引在我编写的代码中会以这种方式表现。 在交互式R控制台中,索引的行为符合预期并更改了向量长度,那么为什么它在函数中的行为会有所不同,以及为我尝试做的索引建立索引的适当方法是什么?

代码异常行为的原因是矢量元素索引出错。 mid+1:length(vec)应为(mid+1):length(vec)因为:运算符在加法之前执行。

这是差异的说明。

5 + 1:10
# [1]  6  7  8  9 10 11 12 13 14 15
(5+1):10
# [1]  6  7  8  9 10

进行二进制搜索可能是有原因的(更复杂问题的简化示例?),但是在R中有更简单的方法可以执行此操作。

vec <- 1:1000
x <- 49
min(vec[which(vec > x)])
# [1] 50

即使未订购vec,该方法仍然有效。

vec <- sample.int(1000)
min(vec[which(vec > x)])
# [1] 50

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM