首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换函数作为R6类成员函数

替换函数作为R6类成员函数
EN

Stack Overflow用户
提问于 2019-08-23 01:20:13
回答 1查看 68关注 0票数 3

我一直在尝试使用R6 ab,并试图实现一个替换函数(在精神上类似于base::`diag<-`())。当我得知以下方法不起作用时,我并不感到非常惊讶。

代码语言:javascript
复制
library(R6)

r6_class <- R6Class("r6_class",
  public = list(
    initialize = function(x) private$data <- x,
    elem = function(i) private$data[i],
    `elem<-` = function(i, val) private$data[i] <- val
  ),
  private = list(
    data = NULL
  )
)

test <- r6_class$new(1:5)
test$elem(2)
#> [1] 2
test$elem(2) <- 3
#> Error in test$elem(2) <- 3 :
#>  target of assignment expands to non-language object

在前缀表示法中,这对应于什么?下面的所有代码都按照预期工作,所以我猜它们都不是

代码语言:javascript
复制
test$`elem<-`(2, 3)
`$`(test, "elem<-")(2, 3)

我对可能的变通方法不感兴趣,但更感兴趣的是理解为什么上面的方法是无效的。

EN

回答 1

Stack Overflow用户

发布于 2019-08-23 05:56:20

您可以使用嵌套的复杂赋值,例如

代码语言:javascript
复制
names(x)[3] <- "c"

代码语言:javascript
复制
test$elem(2) <- 3

不是那种形式。它将是合法语法,如下所示

代码语言:javascript
复制
elem(test,2) <- 3

它将扩展为

代码语言:javascript
复制
*tmp* <- test
test <- `elem<-`(*tmp*, 2, 3)

但在最初的形式中,它必须扩展到

代码语言:javascript
复制
*tmp* <- 2
2 <- `test$elem<-`(*tmp*, 3)

(我在反引号中使用了test$elem<-,这表明它是test$elem返回的函数的赋值版本。这并不是真的正确,根本没有这样的事情。)主要的问题是被修改的对象是2,所以你会得到你看到的错误消息:你不允许修改2

如果你想在R6中做到这一点,我认为你可以这样做。定义全局函数

代码语言:javascript
复制
`elem<-` <- function(x, arg, value) x$`elem<-`(arg, value)

并将类elem<-方法的定义更改为

代码语言:javascript
复制
`elem<-` = function(i, val) { private$data[i] <- val; self }

每个赋值方法都需要两个定义,这并不是很方便,但它似乎是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57614274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档