Как передать значение индекса в методе замены - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать метод замены для класса, но я пытаюсь понять, как передать индекс замены.Вот игрушечный пример:

Вот ExampleClass:

# class definiton
setClass('ExampleClass', representation(lists = 'list'))

# class constructor
ExampleClass <- function(lists){
  ec <- new('ExampleClass', lists = lists)
} 

А вот мои методы получения и установки:

setGeneric('seeLists', function(x) standardGeneric('seeLists'))
setMethod('seeLists', 'ExampleClass', function(x){
  return(x@lists)
})

setGeneric('seeLists<-', function(x, i, value) 
standardGeneric('seeLists<-'))

setMethod('seeLists<-', 'ExampleClass', function(x, i, value){
   x@lists[[i]] <- value
   return(x)
})

Теперь, если я создамобъект класса ExampleClass Я могу получить доступ к элементам в поле списков.

testObj <- ExampleClass(list('a' = c(1:3), 'b' = c(4:6)))

seeLists(testObj)
$a
[1] 1 2 3

$b
[1] 4 5 6

seeLists(testObj)[[1]]
[1] 1 2 3

Но если я хочу заменить один из них, как мне указать интерпретатору, какой параметр i.

newitem <- c(7:9)
seeLists(testObj)[[2]] <- newitem

Error in x@lists[[i]] <- value : [[ ]] with missing subscript

Полагаю, что способ, которым я определил seeLists<- метод замены, неверен, может ли кто-нибудь просветить меня, какой путь правильный?Бонус: что если бы это был двухмерный объект, как бы вы определили j?Заранее спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Это распространенная путаница, когда мы называем

foo(myObject)[[i]] <- value

, это интерпретируется следующим образом:

*tmp* <- {foo(myObject) <- value}
*tmp*[[i]] <- x
*tmp*

Таким образом, вы можете изменить определение seeLists<- на

setMethod('seeLists<-', 'ExampleClass', function(x, i, value){
  return(ExampleClass(value))
})

и все будет работать как нужно.Это может выглядеть странно, но [[<- обрабатывается автоматически в этом случае, и вам не нужно писать это самостоятельно, так как в этом случае работает поведение по умолчанию [[<- (если это не так, вам потребуетсянаписать отдельный метод для [[<-.)

> testObj <- ExampleClass(list('a' = c(1:3), 'b' = c(4:6)))
> newitem <- c(7:9)
> seeLists(testObj)[[1]] <- newitem
> testObj
An object of class "ExampleClass"
Slot "lists":
$a
[1] 7 8 9

$b
[1] 4 5 6
> testObj <- ExampleClass(list('a' = c(1:3), 'b' = c(4:6)))
> newitem <- c(7:9)
> seeLists(testObj)[[2]] <- newitem
> testObj
An object of class "ExampleClass"
Slot "lists":
$a
[1] 1 2 3

$b
[1] 7 8 9
...