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 中调试,我发现了为什么它不起作用的机制:在我上面的函数中索引向量返回一个相同长度的向量,所以 if
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 控制台中,索引的行为符合预期并更改了向量长度,那么为什么它在一个函数中的行为会有所不同,对于我正在尝试做的事情,索引的适当方式是什么?
您进行二分查找可能是有原因的(更复杂问题的简化示例?),但在 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
代码异常行为的原因是向量元素的索引错误。 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 中编写了一个递归二分查找函数,用于查找向量中大于给定值的最小元素:
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 中调试,我发现了为什么它不起作用的机制:在我上面的函数中索引向量返回一个相同长度的向量,所以 if
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 控制台中,索引的行为符合预期并更改了向量长度,那么为什么它在一个函数中的行为会有所不同,对于我正在尝试做的事情,索引的适当方式是什么?
您进行二分查找可能是有原因的(更复杂问题的简化示例?),但在 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
代码异常行为的原因是向量元素的索引错误。 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