簡體   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