R Reference 中的非标准集合函数 类
Non-standard set-functions in R Reference Classes
是否可以获取语法
foo$bar(x) <- value
在 foo
是引用 class 对象而 bar
是方法的地方工作?
IE。是否可以执行 "subset assigment" 并将 "replacement functions" 作为参考 类 中的方法?
是否可以使用其他 OO 系统获得语法?
示例:
我将用一个虚构的用例来说明。想象一个引用class,Person
,里面包含了一个人的一些基本信息。特别是,一个名为 fullname
的字段是一个名为 list
:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
接下来,我们应该定义一些方法来获取和设置 fullnames
列表中的特定名称,这些名称(尝试)给出上面的 syntax/interface。到目前为止,我的最佳尝试是:
PersonRCGen$methods(
name = function(x) { # x is the dataset,
.self$fullname[[x]]
},
`name<-` = function(x, value) {
.self$fullname[[x]] <- value
}
)
这里的命名也应该说明我正在尝试做什么。
我们初始化一个新对象:
a_person <- PersonRCGen$new(fullname = list(first = "Jane", last = "Doe"),
gender = "F")
直接访问 fullname
字段并通过定义的 get 函数访问名字和姓氏按预期工作:
a_person$fullname
#$`first`
#[1] "Jane"
#
#$last
#[1] "Doe"
a_person$name("first")
#[1] "Jane"
a_person$name("last")
#[1] "Doe"
但是,为了在 fullname
列表中设置一个特定的名称,我想要下面的 syntax/interface,不幸的是失败了。
a_person$name("first") <- "Jessie"
#Error in a_person$name("first") <- "Jessie" :
# target of assignment expands to non-language object
我知道以下作品(基本上使方法命名不当)。
a_person$`name<-`("first", "Johnny")
a_person$fullname
#$`first`
#[1] "Johnny"
#
#$last
#[1] "Doe"
在我的实际用例中,我想避免使用 'traditional' getName(x)
和 setName(x, value)
get 和 set 函数的名称。
我可能误解了您要实现的目标,但这有什么问题吗?
person = setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
a_person = person$new(fullname = list(first = "James", last = "Brown"), gender="M")
a_person$fullname$first = "Bob"
a_person
Reference class object of class "Person"
Field "fullname":
$`first`
[1] "Bob"
$last
[1] "Brown"
Field "gender":
[1] "M"
我不认为你可以用你想要的语法来做到这一点。
请注意,如果您 运行 任何类似的赋值,您将得到相同的错误,例如
a_person$hello("first") <- "John"
所以这确实是一个基本问题。
有效的是以下语法:
name(a_person, "first") <- "John"
总而言之,您可以得到如下内容:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
),
methods = list(
initialize = function(...) {
initFields(...)
},
name = function(x) {
.self$fullname[[x]]
}
)
)
setGeneric("name<-", function(x, y, value) standardGeneric("name<-"))
setMethod("name<-", sig = "ANY", function(x, y, value) {
UseMethod("name<-")
})
# some extras
"name<-.default" <- function(x, y, value) {
stop(paste("name assignment (name<-) method not defined for class", class(x)))
}
"name<-.list" <- function(x, y, value) {
x[[y]] <- value
return(x)
}
# and here specifically
"name<-.Person" <- function(x, y, value) {
x$fullname[[y]] <- value
return(x)
}
# example to make use of the above
a_person <- PersonRCGen$new(
fullname = list(
first = "Jane",
last = "Doe"
),
gender = "F"
)
a_person$name("first")
#> [1] "Jane"
name(a_person, "middle") <- "X."
a_person$name("middle")
#> [1] "X."
我知道这不是您想要的,但希望对您有所帮助。
是否可以获取语法
foo$bar(x) <- value
在 foo
是引用 class 对象而 bar
是方法的地方工作?
IE。是否可以执行 "subset assigment" 并将 "replacement functions" 作为参考 类 中的方法?
是否可以使用其他 OO 系统获得语法?
示例:
我将用一个虚构的用例来说明。想象一个引用class,Person
,里面包含了一个人的一些基本信息。特别是,一个名为 fullname
的字段是一个名为 list
:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
接下来,我们应该定义一些方法来获取和设置 fullnames
列表中的特定名称,这些名称(尝试)给出上面的 syntax/interface。到目前为止,我的最佳尝试是:
PersonRCGen$methods(
name = function(x) { # x is the dataset,
.self$fullname[[x]]
},
`name<-` = function(x, value) {
.self$fullname[[x]] <- value
}
)
这里的命名也应该说明我正在尝试做什么。
我们初始化一个新对象:
a_person <- PersonRCGen$new(fullname = list(first = "Jane", last = "Doe"),
gender = "F")
直接访问 fullname
字段并通过定义的 get 函数访问名字和姓氏按预期工作:
a_person$fullname
#$`first`
#[1] "Jane"
#
#$last
#[1] "Doe"
a_person$name("first")
#[1] "Jane"
a_person$name("last")
#[1] "Doe"
但是,为了在 fullname
列表中设置一个特定的名称,我想要下面的 syntax/interface,不幸的是失败了。
a_person$name("first") <- "Jessie"
#Error in a_person$name("first") <- "Jessie" :
# target of assignment expands to non-language object
我知道以下作品(基本上使方法命名不当)。
a_person$`name<-`("first", "Johnny")
a_person$fullname
#$`first`
#[1] "Johnny"
#
#$last
#[1] "Doe"
在我的实际用例中,我想避免使用 'traditional' getName(x)
和 setName(x, value)
get 和 set 函数的名称。
我可能误解了您要实现的目标,但这有什么问题吗?
person = setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
a_person = person$new(fullname = list(first = "James", last = "Brown"), gender="M")
a_person$fullname$first = "Bob"
a_person
Reference class object of class "Person"
Field "fullname":
$`first`
[1] "Bob"
$last
[1] "Brown"
Field "gender":
[1] "M"
我不认为你可以用你想要的语法来做到这一点。
请注意,如果您 运行 任何类似的赋值,您将得到相同的错误,例如
a_person$hello("first") <- "John"
所以这确实是一个基本问题。
有效的是以下语法:
name(a_person, "first") <- "John"
总而言之,您可以得到如下内容:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
),
methods = list(
initialize = function(...) {
initFields(...)
},
name = function(x) {
.self$fullname[[x]]
}
)
)
setGeneric("name<-", function(x, y, value) standardGeneric("name<-"))
setMethod("name<-", sig = "ANY", function(x, y, value) {
UseMethod("name<-")
})
# some extras
"name<-.default" <- function(x, y, value) {
stop(paste("name assignment (name<-) method not defined for class", class(x)))
}
"name<-.list" <- function(x, y, value) {
x[[y]] <- value
return(x)
}
# and here specifically
"name<-.Person" <- function(x, y, value) {
x$fullname[[y]] <- value
return(x)
}
# example to make use of the above
a_person <- PersonRCGen$new(
fullname = list(
first = "Jane",
last = "Doe"
),
gender = "F"
)
a_person$name("first")
#> [1] "Jane"
name(a_person, "middle") <- "X."
a_person$name("middle")
#> [1] "X."
我知道这不是您想要的,但希望对您有所帮助。