r - 如何使用方法在 S4 对象 r 中设置值(无需输入值)
问题描述
这是一个两部分的问题。我想根据不同的插槽值设置原型 s4 对象的值,或者我想将其作为一种方法来实现。
我有一个我正在尝试创建的对象。它有一些插槽。我想根据从另一个插槽输入的值设置一个插槽值。这是我想做的简化版本。
IE,
setClass("Person",
representation(name = "character", age = "numeric", doubleAge = "numeric"),
prototype(name = "Bob", age = 5, doubleAge = 10) )
现在我想创建一个对象,但根据年龄槽设置自己的 doubleAge 值。
p1 <- new("Person", name = "Alice", age = 6)
我懂了
An object of class "Person"
Slot "name":
[1] "Alice"
Slot "age":
[1] 6
Slot "doubleAge":
[1] 10
但我想看到 doubleAge 是 12。在原型中,我不知道如何更改doubleAge = 10
为类似doubleAge = 2*age
因此,作为一种解决方案,我尝试创建一个设置函数init
,在创建后设置值。这是第 2 部分的问题。
setGeneric("init", "Person", function(object) {
standardGeneric("init")
}
setMethod("init","Person", function(object) {
object@doubleAge <- object@age*2
object
}
如果我在方法中打印object@doubleAge
它返回 12 但似乎范围结束了,因为它返回时为 10
目前有效的方法非常相似,但不正确。
setGeneric("init<-", "Person", function(object) {
standardGeneric("init<-")
}
setMethod("init<-","Person", function(object) {
object@doubleAge <- object@age*2
object
}
但后来我不得不打电话给init(p1) <- NULL
这看起来很奇怪。我知道这个例子看起来微不足道,但它只是一个更复杂的现实世界问题的简单例子。
解决方案
似乎覆盖初始化方法对我有用。例如
setClass("Person",
representation(name = "character", age = "numeric", doubleAge = "numeric"),
prototype(name = "Bob", age = 5, doubleAge = 10) )
setMethod("initialize", "Person", function(.Object, ...) {
.Object <- callNextMethod()
.Object@doubleAge <- .Object@age*2
.Object
})
(p1 <- new("Person", name = "Alice", age = 6))
# An object of class "Person"
# Slot "name":
# [1] "Alice"
# Slot "age":
# [1] 6
# Slot "doubleAge":
# [1] 12
运行“callNextMethod()
默认”初始化程序来设置我们没有搞砸的所有值。然后我们只需更改我们想要的值并返回更新的对象。
推荐阅读
- python-3.x - Smarthseet API 列表单张 (Python)
- ios - 无法使用 Apollo 框架构建 Xcode iOS 项目以使用 GraphQL
- java - 导出时Java按钮不可点击
- regex - 用正则表达式替换文件中的特殊字符
- python - 使用 Keras 的多类分类中的数组形状错误
- javascript - 如何使用 fetch 将 JSON API 值输出到 DOM
- email - 如何使用 Office 365 发送超过 10,000 封电子邮件
- android - 将无人机相机数据从我的应用程序发送到服务器(然后发送到客户端)
- alexa - Alexa INTERNAL_SERVICE_EXCEPTION [从输入流中读取实体时出错]
- github - 每次合并到 master 时触发 webhook - GitHub Webhooks