R:如何使冒号操作符的行为与Python numpy中的切片类似;直到最后;?
在PythonR:如何使冒号操作符的行为与Python numpy中的切片类似;直到最后;?,r,operator-overloading,R,Operator Overloading,在Pythonnumpy中,您可以使用冒号运算符引用数组的最后(比如2)个元素,而无需明确说明您正在“切片到结束位置”,如下所示: import numpy as np arr = np.array(range(5)) arr[3:] arr[4:length(arr)] 或 在R中,使用一个简单的向量,您可以使用tail函数: arr = 0:4 tail(arr, 2) 或者,您可以使用冒号运算符对向量进行切片,但必须指定“结束位置”,如下所示: import numpy as np
numpy
中,您可以使用冒号运算符引用数组的最后(比如2)个元素,而无需明确说明您正在“切片到结束位置”,如下所示:
import numpy as np
arr = np.array(range(5))
arr[3:]
arr[4:length(arr)]
或
在R中,使用一个简单的向量,您可以使用tail
函数:
arr = 0:4
tail(arr, 2)
或者,您可以使用冒号运算符对向量进行切片,但必须指定“结束位置”,如下所示:
import numpy as np
arr = np.array(range(5))
arr[3:]
arr[4:length(arr)]
有没有办法使R的冒号操作符的行为与Pythonnumpy
数组中的行为相同?不知怎的,让它超载。至少对于最后一种情况,您希望arr[4://code>为最后两个位置(4和5)切片向量。您不能使用arr[3://code>,因为解析器不允许您使用
你可以这样做(触发警告,那会很难看):
我们将重载'['
,并修改参数,以将:Inf
替换为输入的相关维度。这不是一个通用解决方案(尽管可以构建一个),并且会减慢一切
它与嵌套的括号(如test_array[1:8[2:Inf]]
)也不一样
`[` <- function(a,...){
ellipsis <- as.character(substitute(list(...)));
if(length(ellipsis) == 2){
base::'['(a, eval(parse(text=gsub(":Inf",paste0(":",length(a)),ellipsis[[2]]))))
} else {
base::'['(a, eval(parse(text=gsub(":Inf",paste0(":",nrow(a)),ellipsis[[2]]))),
eval(parse(text=gsub(":Inf",paste0(":",ncol(a)),ellipsis[[3]]))))
}
}
test_array <- 1:10
test_matrix <- matrix(1:16,ncol=4)
test_array[5:Inf]
# [1] 5 6 7 8 9 10
test_matrix[3:Inf,2:Inf]
# [,1] [,2] [,3]
# [1,] 7 11 15
# [2,] 8 12 16
`[`注意,头部和尾部也适用于矩阵:(mat Nice.小心你想要什么,嗯?事实上,也许我在文章末尾添加的那句话对你更实用:)