r - 如何原型(prototype)(启动)从其他插槽派生的 S4 插槽?

假设我有一个中四类

setClass("Person", representation(name = "character", first_letter = "character")

我想在启动对象时自动填充插槽 first_letter。有点像

> jack <- new("Person", name = "Jack")
> print(jack)
# Slot "name":
# "Jack"
#
# Slot "first_letter":
# "J"

我想我应该这样做:

setClass("Person", 
  representation(name = "character", first_letter = "character"),
  prototype(first_letter = substring(self@name, 1, 1))
)

当然,我可以在单独的语句中编写一个方法来执行此操作。我对 first_letter 插槽在调用 new 时使用来自另一个插槽的信息启动的情况特别感兴趣。

非常感谢任何帮助!

最佳答案

一种方法是将 first_letter 视为私有(private)字段。

  1. 创建自定义构造函数(initiate),使用其他公共(public)字段设置私有(private)字段
  2. 为公共(public)槽定义 set/get 以在更改其他字段时保持相同的逻辑。

这里是一个实现:

## Note the use of `.` for private field
## this is just a convention
Person <- setClass("Person", representation(Name = "character", 
                                            first_letter. = "character"))

## define setter and getter for public slots
setGeneric("Name", function(x) standardGeneric("Name"))
setMethod("Name","Person",function(x)  x@Name)
setGeneric("Name<-", function(x,value) standardGeneric("Name<-"))
setMethod("Name<-","Person",function(x,value){
  x@Name <- value
  x@first_letter. <- substring(value, 1, 1)
  x
})
## define the constructor
## Note that we don't give an argument to the ctor 
## to init the private field
setMethod ("initialize", signature  = "Person",
           definition = function (.Object,
                                  name) {
             .Object@Name <- name
             .Object@first_letter. <- substring(name, 1, 1)
             return (.Object)
           })

现在,通过创建一个对象来测试它:

> p <- Person(name="Amine")
> p
An object of class "Person"
Slot "Name":
[1] "Amine"
## the slot is automatically initialized
Slot "first_letter.":
[1] "A"

然后我们更改插槽值:

> Name(p) <- "Xvalue"
> p
An object of class "Person"
Slot "Name":
[1] "Xvalue"
## Again the private slot is updated
Slot "first_letter.":
[1] "X"

https://stackoverflow.com/questions/38275161/

相关文章:

c - 我无法理解打印第一个八个数组元素的数组的输出

java - 这个While 循环可以简化吗?

r - 从列值比较中确定 R 数据框行值

java - 为什么 Double::compareTo 可以作为 Stream.max(Compa

intellij-idea - IdeaVim:如何在不使用箭头键的情况下循环浏览列表项?

java - Java 中的静态方法调用是如何工作的?

java - 在NIFI中创建自定义 Controller 服务时无法生成扩展的文档

prolog - Prolog数据库的Web访问

java - 如何将充满 if 语句的 for 循环更改为更优雅/高效的代码?

java - 检查字符串中是否存在模式