gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:27:06 26 4
gpt4 key购买 nike

假设我有一个中四类

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"

关于r - 如何原型(prototype)(启动)从其他插槽派生的 S4 插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38275161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com