【发布时间】:2019-01-15 20:56:14
【问题描述】:
是否可以获取语法
foo$bar(x) <- value
在foo 是引用类对象且bar 是方法的情况下工作?
IE。是否可以在引用类中进行“子集分配”并具有“替换函数”作为方法?
其他 OO 系统可以使用该语法吗?
示例:
我将用一个虚构的用例来说明。想象一个参考类Person,其中包含一个人的一些基本信息。特别是,一个名为fullname 的字段是一个名为list:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
接下来,我们应该定义一些方法来获取和设置fullnames 列表中的特定名称(尝试)以提供上述语法/接口。到目前为止,我最好的尝试是:
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 列表中设置特定名称,我希望使用以下语法/接口,但不幸的是失败了。
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"
在我的实际用例中,我想避免 get 和 set 函数使用“传统”getName(x) 和 setName(x, value) 名称。
【问题讨论】:
-
我认为此类功能的“特定名称”将是“分配”。您还应该意识到
$<-是[[<-的同义词,尽管您的代码表明您可能已经理解了这一点。 -
@42- 是的,但赋值通常指的是
assign-函数或<-,当然这也是一个函数。至于$<-和[[<-,我想说这些是子集上下文中“赋值函数”的例子。我更想为所有承认foo(x) <- value语法的'foo<-'(x, value)函数命名。因此,如果您愿意,我会为这种类型的函数寻找一个 more 特定名称(如果存在)。换句话说,我如何用谷歌搜索它? -
我认为搜索文档文件更有可能返回可管理的点击数。
-
因此,“命名分配”或“按字符索引分配”或“子分配”可能会在比 Rhelp 或 R-devel 更熟悉参考类函数的人身上触发适当的神经元集我是吗?
标签: r reference-class