gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:34:03 25 4
gpt4 key购买 nike

我一直在研究 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)

我对可能的解决方法不太感兴趣,但更想了解为什么上述内容无效。

最佳答案

你可以有嵌套的复杂赋值,例如

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 }

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

关于作为 R6 类成员函数的替换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com