Как присвоить значения новым объектам в R с помощью индексации? - PullRequest
1 голос
/ 16 июня 2020

Для новых объектов в R, как я могу указать назначения для элементов с индексами? Как в object[3] <- new value. Вот конкретный c пример моей проблемы.

# Rectangle example:
Rectangle <- function(a, b,...){
   R <- list(a=a, b=b, others=list(...))
   structure(R, class="Rectangle")
}#
`[.Rectangle` <- function(R,ind){
   if(ind==1) return(R$a)
   if(ind==2) return(R$b)
   if(ind>=3) return(R$others[[ind-2]])   
}#
R <- Rectangle(2,3,"other1","other2")
> R[1]; R[2]; R[3]; R[4]; 
[1] 2
[1] 3
[1] "other1"
[1] "other2"
> R[4] <- "new.other"; 
> R[1]; R[2]; R[3]; R[4];
[1] 2
[1] 3
[1] "other1"
[1] "other2"

Очевидно, присвоение объекта с индексами не сработало. Я хотел бы знать синтаксис, чтобы правильно определять такие назначения. То есть мне понадобится пример следующего:

`[<-.Rectangle` <- function(){  } 

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Чтобы переопределить назначение подмножества, ваша функция должна принять три аргумента (x, index, value) и вернуть измененный объект. Важно, чтобы третий параметр назывался точно value, поскольку R внутренне вызывает функцию, используя это имя (а не позиционно).

Вот пример:

`[<-.Rectangle` = function (x, index, value) {
    if (index == 1L) {
        x$a = value
    }
    else if (index == 2L) {
        x$b = value
    }
    else {
        x$others[[index - 2L]] = value
    }
    x
}

Само собой разумеется, что это довольно запутанная логика c, я не уверен, что в реальном коде должны быть объекты с таким API.

0 голосов
/ 16 июня 2020

Может это вам поможет:

> str(R)
List of 3
 $ a     : num 2
 $ b     : num 3
 $ others:List of 2
  ..$ : chr "other1"
  ..$ : chr "other2"
 - attr(*, "class")= chr "Rectangle"

> R[4]='hello'
> str(R)
List of 4
 $ a     : num 2
 $ b     : num 3
 $ others:List of 2
  ..$ : chr "other1"
  ..$ : chr "other2"
 $       : chr "hello"
 - attr(*, "class")= chr "Rectangle"


> R[4]
[1] "other2"

> R[[4]]
[1] "hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...