我一直在尝试使用R6 ab,并试图实现一个替换函数(在精神上类似于base::`diag<-`())。当我得知以下方法不起作用时,我并不感到非常惊讶。
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在前缀表示法中,这对应于什么?下面的所有代码都按照预期工作,所以我猜它们都不是
test$`elem<-`(2, 3)
`$`(test, "elem<-")(2, 3)我对可能的变通方法不感兴趣,但更感兴趣的是理解为什么上面的方法是无效的。
发布于 2019-08-23 05:56:20
您可以使用嵌套的复杂赋值,例如
names(x)[3] <- "c"但
test$elem(2) <- 3不是那种形式。它将是合法语法,如下所示
elem(test,2) <- 3它将扩展为
*tmp* <- test
test <- `elem<-`(*tmp*, 2, 3)但在最初的形式中,它必须扩展到
*tmp* <- 2
2 <- `test$elem<-`(*tmp*, 3)(我在反引号中使用了test$elem<-,这表明它是test$elem返回的函数的赋值版本。这并不是真的正确,根本没有这样的事情。)主要的问题是被修改的对象是2,所以你会得到你看到的错误消息:你不允许修改2。
如果你想在R6中做到这一点,我认为你可以这样做。定义全局函数
`elem<-` <- function(x, arg, value) x$`elem<-`(arg, value)并将类elem<-方法的定义更改为
`elem<-` = function(i, val) { private$data[i] <- val; self }每个赋值方法都需要两个定义,这并不是很方便,但它似乎是有效的。
https://stackoverflow.com/questions/57614274
复制相似问题