R S4 方法应用于 Class 中的对象列表
R S4 Methods Applied to List of Objects in a Class
我是一个流利的 R 长期用户,我开始熟悉 classes 和方法。我对此还很陌生,并且正在研究概念。
特别是今天,我试图将一种方法应用于对象列表,所有对象都在特定的用户生成的 class.
中
举个例子:
#define car
setClass("car",
representation(
name = "character",
mpg = "numeric"
)
)
#create some cars
cars <- lapply(1:nrow(mtcars), function(x) new("car", name =
rownames(mtcars)[x], mpg = mtcars$mpg[x]))
##SAMPLE MPG GROWTH METHOD
setGeneric("grow.mpg", function(car) {
standardGeneric("grow.mpg")
})
setMethod("grow.mpg",
signature("car"),
function(car){
old_mpg <- car@mpg
car@mpg <- car@mpg * .1 + car@mpg
message(paste("growing mpg on ", car@name, " from ", old_mpg, " to
", car@mpg, sep = ''))
return(car)
})
#APPLY METHOD
cars[[1]] <- grow.mpg(cars[[1]])
growing mpg on Mazda RX4 from 25.41 to 27.951
这在 cars[[1]]
上成功地将 mpg 提高了 10%:
cars[[1]]
An object of class "car"
Slot "name":
[1] "Mazda RX4"
Slot "mpg":
[1] 27.951
但是将方法 grow.mpg
应用于所有 cars
会引发以下错误:
cars <- grow.mpg(cars)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘grow.mpg’ for
signature ‘"list"’
所以两个问题:
- 这是为什么?
- 如何将
grow.mpg
应用于所有 cars
?
提前致谢!
您已经为 class "car" 的对象定义了 grow.mpg
函数。 class(cars[[1]])
是 "car" 但 class(cars)
是 "list"。
就像 R 中的其他任何东西一样(并不是 S4 真正独有的 classes),每当你想对列表中的每个元素应用相同的函数并获得一个新列表时,返回,你只需使用 lapply
。
cars <- lapply(cars, grow.mpg)
我是一个流利的 R 长期用户,我开始熟悉 classes 和方法。我对此还很陌生,并且正在研究概念。
特别是今天,我试图将一种方法应用于对象列表,所有对象都在特定的用户生成的 class.
中举个例子:
#define car
setClass("car",
representation(
name = "character",
mpg = "numeric"
)
)
#create some cars
cars <- lapply(1:nrow(mtcars), function(x) new("car", name =
rownames(mtcars)[x], mpg = mtcars$mpg[x]))
##SAMPLE MPG GROWTH METHOD
setGeneric("grow.mpg", function(car) {
standardGeneric("grow.mpg")
})
setMethod("grow.mpg",
signature("car"),
function(car){
old_mpg <- car@mpg
car@mpg <- car@mpg * .1 + car@mpg
message(paste("growing mpg on ", car@name, " from ", old_mpg, " to
", car@mpg, sep = ''))
return(car)
})
#APPLY METHOD
cars[[1]] <- grow.mpg(cars[[1]])
growing mpg on Mazda RX4 from 25.41 to 27.951
这在 cars[[1]]
上成功地将 mpg 提高了 10%:
cars[[1]]
An object of class "car"
Slot "name":
[1] "Mazda RX4"
Slot "mpg":
[1] 27.951
但是将方法 grow.mpg
应用于所有 cars
会引发以下错误:
cars <- grow.mpg(cars)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘grow.mpg’ for
signature ‘"list"’
所以两个问题:
- 这是为什么?
- 如何将
grow.mpg
应用于所有cars
?
提前致谢!
您已经为 class "car" 的对象定义了 grow.mpg
函数。 class(cars[[1]])
是 "car" 但 class(cars)
是 "list"。
就像 R 中的其他任何东西一样(并不是 S4 真正独有的 classes),每当你想对列表中的每个元素应用相同的函数并获得一个新列表时,返回,你只需使用 lapply
。
cars <- lapply(cars, grow.mpg)