如何在替换方法中传递索引值

时间:2019-01-25 13:34:48

标签: r oop s4

我正在尝试为一个类创建一个replace方法,但是我在理解如何传递替换索引方面很挣扎。这是一个玩具示例:

这里是ExampleClass

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

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

这是我的getter和setter方法:

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 :(得分:1)

当我们打电话时,这是一个常见的困惑

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