Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何使冒号操作符的行为与Python numpy中的切片类似;直到最后;?_R_Operator Overloading - Fatal编程技术网

R:如何使冒号操作符的行为与Python numpy中的切片类似;直到最后;?

R:如何使冒号操作符的行为与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

在Python
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的冒号操作符的行为与Python
numpy
数组中的行为相同?不知怎的,让它超载。至少对于最后一种情况,您希望
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.小心你想要什么,嗯?事实上,也许我在文章末尾添加的那句话对你更实用:)