gpt4 book ai didi

r - R 引用类中的私有(private)成员

转载 作者:行者123 更新时间:2023-12-04 02:17:43 24 4
gpt4 key购买 nike

是否可以在 R 引用类中包含私有(private)成员字段。玩一些我有的在线示例:

> Account <- setRefClass(    "ref_Account"
> , fields = list(
> number = "character"
> , balance ="numeric")
> , methods = list(
> deposit <- function(amount) {
> if(amount < 0) {
> stop("deposits must be positive")
> }
> balance <<- balance + amount
> }
> , withdraw <- function(amount) {
> if(amount < 0) {
> stop("withdrawls must be positive")
> }
> balance <<- balance - amount
> }
> ) )
>
>
> tb <- Account$new(balance=50.75, number="baml-029873") tb$balance
> tb$balance <- 12
> tb$balance

我讨厌我可以直接更新余额的事实。也许我身上的旧纯 OO,我真的希望能够将平衡设为私有(private),至少不能从类外设置。

想法

最佳答案

为了解决隐私问题,我创建了一个自己的类“Private”,它具有访问对象的新方法,即 $[[ .如果客户端尝试访问“私有(private)”成员,这些方法将引发错误。私有(private)成员由名称(前导句点)标识。由于引用对象是 R 中的环境,因此可以解决此问题,但这是我目前的解决方案,我认为使用该类提供的 get/set 方法更方便。因此,这更像是该问题的“难以从类外设置”的解决方案。

我已将其组织在一个 R 包中,因此以下代码使用该包并修改上面的示例,以便分配给 tb$.balance产生错误。我也使用函数Class这只是 setRefClass 的包装所以这仍然在方法包提供并在问题中使用的 R 引用类的范围内。

devtools::install_github("wahani/aoos")
library("aoos")

Account <- defineRefClass({
Class <- "Account"
contains <- "Private"

number <- "character"
.balance <- "numeric"

deposit <- function(amount) {
if(amount < 0) stop("deposits must be positive")
.balance <<- .balance + amount
}

withdraw <- function(amount) {
if(amount < 0) stop("withdrawls must be positive")
.balance <<- .balance - amount
}
})

tb <- Account(.balance = 50.75, number = "baml-029873")
tb$.balance # error
tb$.balance <- 12 # error

关于r - R 引用类中的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159317/

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