R 添加一个 class 到一个字段
R add a class to a field
我在 R 中创建了两个 classes:
library(methods)
Foo <- setClass(
# Set the name for the class
"Foo",
# Define the slots
slots = c(
# THIS IS PROBABLY WRONG
bar = "S4"
),
)
和
Bar <- setClass(
# Set the name for the class
"Bar",
# Define the slots
slots = c(
a = "character"
),
# Set the default values for the slots. (optional)
prototype=list(
a = "qwerty"
),
)
我想按照 Foo.bar <- Bar()
的思路说点什么。我认为应该这样做:
# create a method to assign the value of a coordinate
setGeneric(name="addBar",
def=function(theObject)
{
standardGeneric("addBar")
}
)
setMethod(f="addBar",
signature="Foo",
definition=function(theObject)
{
theObject@bar<- Bar
}
)
然后我使用以下方式调用它:
if (!interactive()) {
result <- tryCatch({
foo <- Foo()
foo <- addBar(Foo)
}
,
warning = function(war) {
print('A warning occurred')
print(war)
},
error = function(err){
print('An error occurred')
print(err)
}
)
print(result)
}
但是,如果我 运行 我收到了:
assignment of an object of class “Bar” is not valid for @‘bar’ in an object of class “Foo”; is(value, "S4") is not TRUE>
但是,当我打印 Bar 的类型时,我得到的是 S4。我尝试了多种不同的类型,但我的想法很新鲜。
如何将 class 对象分配给变量?
我换了行
bar = "S4"
到
bar = "Bar"
这似乎解决了问题。
Foo@bar
的class应该是Bar
,你应该先定义classBar
:
Bar <- setClass("Bar",
slots = c(a = "character"),
prototype=list(a = "qwerty")
)
Foo <- setClass("Foo",
slots = c(bar = "Bar")
)
请注意,一旦您创建了 foo <- Foo()
,Foo
的 bar
插槽将 初始化(尝试 str(foo)
,所以我认为你不需要 addBar
泛型。除非它应该做你描述的其他事情。
此外,如果有的话,那么你应该按如下方式定义你的方法:
setMethod(f="addBar", signature="Foo",
definition=function(theObject) {
theObject@bar<- Bar()
})
(假设您只想用一个空的 Bar()
对象初始化 @bar
槽)。如果你这样做 theObject@bar <- Bar
那么你将 class 生成器函数 Bar
分配给插槽 @bar
并且会得到一个错误:
Error in (function (cl, name, valueClass) :
assignment of an object of class “classGeneratorFunction” is not
valid for @‘bar’ in an object of class “Foo”; is(value, "Bar") is not TRUE
最后,注意调用
foo <- addBar(Foo)
并不像你想象的那样。 Foo
是一个用来生成classfoo
新对象的函数。所以 addBar(Foo)
尝试 运行 class classGeneratorFunction
的对象上的 addBar
方法,这可能不是你想要的。
我在 R 中创建了两个 classes:
library(methods)
Foo <- setClass(
# Set the name for the class
"Foo",
# Define the slots
slots = c(
# THIS IS PROBABLY WRONG
bar = "S4"
),
)
和
Bar <- setClass(
# Set the name for the class
"Bar",
# Define the slots
slots = c(
a = "character"
),
# Set the default values for the slots. (optional)
prototype=list(
a = "qwerty"
),
)
我想按照 Foo.bar <- Bar()
的思路说点什么。我认为应该这样做:
# create a method to assign the value of a coordinate
setGeneric(name="addBar",
def=function(theObject)
{
standardGeneric("addBar")
}
)
setMethod(f="addBar",
signature="Foo",
definition=function(theObject)
{
theObject@bar<- Bar
}
)
然后我使用以下方式调用它:
if (!interactive()) {
result <- tryCatch({
foo <- Foo()
foo <- addBar(Foo)
}
,
warning = function(war) {
print('A warning occurred')
print(war)
},
error = function(err){
print('An error occurred')
print(err)
}
)
print(result)
}
但是,如果我 运行 我收到了:
assignment of an object of class “Bar” is not valid for @‘bar’ in an object of class “Foo”; is(value, "S4") is not TRUE>
但是,当我打印 Bar 的类型时,我得到的是 S4。我尝试了多种不同的类型,但我的想法很新鲜。
如何将 class 对象分配给变量?
我换了行
bar = "S4"
到
bar = "Bar"
这似乎解决了问题。
Foo@bar
的class应该是Bar
,你应该先定义classBar
:
Bar <- setClass("Bar",
slots = c(a = "character"),
prototype=list(a = "qwerty")
)
Foo <- setClass("Foo",
slots = c(bar = "Bar")
)
请注意,一旦您创建了 foo <- Foo()
,Foo
的 bar
插槽将 初始化(尝试 str(foo)
,所以我认为你不需要 addBar
泛型。除非它应该做你描述的其他事情。
此外,如果有的话,那么你应该按如下方式定义你的方法:
setMethod(f="addBar", signature="Foo",
definition=function(theObject) {
theObject@bar<- Bar()
})
(假设您只想用一个空的 Bar()
对象初始化 @bar
槽)。如果你这样做 theObject@bar <- Bar
那么你将 class 生成器函数 Bar
分配给插槽 @bar
并且会得到一个错误:
Error in (function (cl, name, valueClass) :
assignment of an object of class “classGeneratorFunction” is not
valid for @‘bar’ in an object of class “Foo”; is(value, "Bar") is not TRUE
最后,注意调用
foo <- addBar(Foo)
并不像你想象的那样。 Foo
是一个用来生成classfoo
新对象的函数。所以 addBar(Foo)
尝试 运行 class classGeneratorFunction
的对象上的 addBar
方法,这可能不是你想要的。