В R, как изменить семантику `[` для работы с прямоугольной системой координат вместо (по умолчанию) матричной индексной системы? - PullRequest
1 голос
/ 04 июня 2019

Я хотел бы переопределить значение оператора подмножества [ для работы с (x, y) координатами вместо (i, j) матричной индексной системы. Я бы хотел, чтобы это работало над матрицами (за кадром).

Сначала я думал о создании класса S4 на основе типа матрицы. А затем используйте обобщенную функцию [ и создайте для нее метод, который будет выполнять поднаборы с заменами i и j. Но теперь я понял, что не могу изменить подпись универсального:

> getGeneric("[")
standardGeneric for "[" defined from package "base"

function (x, i, j, ..., drop = TRUE) 
standardGeneric("[", .Primitive("["))
<bytecode: 0x55f8eef68ad8>
<environment: 0x55f8eef5f310>
Methods may be defined for arguments: x, i, j, drop
Use  showMethods("[")  for currently available ones.

Так есть ли способ сделать это? Я думаю переписать определение [, но мне кажется, что это еретик ... Итак, некоторые советы очень ценятся!

Вот некоторый псевдо-R код, который отражает мои мысли о том, как я могу переопределить [. Ожидаете ли вы неприятностей впереди, если я пойду дальше с этим подходом?

setClass(
  "plane",
  slots = c(
    type = "character",
    xlen = "integer",
    ylen = "integer",
    boundary = "character",
    lattice = "matrix"
  )
)

`[` <- function(obj, x, y, ..., drop = TRUE) {
  if (is(obj, 'plane')) {

    lattice <- base::`[`(x = obj@lattice, i = y, j = x, ..., drop = FALSE)
    xlen <- length(x)
    ylen <- length(y)
    new_plane <- plane(type = obj@type,
                       xlen = xlen,
                       ylen = ylen,
                       boundary = obj@boundary)
    new_plane@lattice <- lattice

    return(new_plane)
  }
  else
    return(base::`[`(x = obj, i = x, j = y, ..., drop = drop))
}
...