如何在替换方法中传递索引值
How to pass index value in replace method
我正在尝试为 class 创建一个替换方法,但我很难理解如何传递替换索引。这是一个玩具示例:
这里是 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
class 的对象,我就可以访问列表字段中的项目。
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<-
replace 方法的方式是错误的,谁能告诉我哪个是正确的方式?奖励:如果它是一个二维对象,你会如何定义 j
?
提前致谢。
这是一个常见的混淆,当我们调用
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
我正在尝试为 class 创建一个替换方法,但我很难理解如何传递替换索引。这是一个玩具示例:
这里是 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
class 的对象,我就可以访问列表字段中的项目。
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<-
replace 方法的方式是错误的,谁能告诉我哪个是正确的方式?奖励:如果它是一个二维对象,你会如何定义 j
?
提前致谢。
这是一个常见的混淆,当我们调用
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