gpt4 book ai didi

r - 定义调用 R6 对象之外的其他方法的方法

转载 作者:行者123 更新时间:2023-12-04 20:36:13 28 4
gpt4 key购买 nike

使用 R6 类时,在类之外定义调用其他方法的方法的正确方法是什么?

考虑以下示例,其中函数 func如果它被交互使用,可能会分派(dispatch)给另一个函数。但是,如果这样做,则其他功能无法访问私有(private)环境。如果我以这种方式定义类,我应该传递一个环境吗?

## General function defined outside R6 class
func <- function(x) {
if (missing(x) && interactive()) {
ifunc()
} else {
private$a <- x * x
}
}

## If interactive, redirect to this function
ifunc <- function() {
f <- switch(menu(c('*', '+')), '1'=`*`, '2'=`+`)
private$a <- f(private$a, private$a)
}

## R6 test object
Obj <- R6::R6Class("Obj",
public=list(
initialize=function(a) private$a <- a,
geta=function() private$a,
func=func # defined in another file
),
private=list(
a=NA
)
)

## Testing
tst <- Obj$new(5)
tst$func(3)
tst$geta() # so func sees 'private'
# [1] 9

tst$func() # doesn't see 'private'

Error in ifunc() (from #3) : object 'private' not found

最佳答案

您面临的问题是您定义 funcifunc以这样一种方式,实现只在类定义内部有意义 - 但不完全。您收到错误是因为 ifunc被实现就好像它知道你的类的内部(它指的是私有(private)的),但它不知道。你从来没有真正将它包含在你的类定义中。所以你必须引用 func到私有(private)成员函数 ifunc并包括 ifunc进入类:

func <- function(x) {
if (missing(x) && interactive()) {
private$ifunc()
} else {
private$a <- x * x
}
}


ifunc <- function() {
f <- switch(menu(c('*', '+')), '1'=`*`, '2'=`+`)
private$a <- f(private$a, private$a)
}


Obj <- R6::R6Class(
"Obj",
public=list(
initialize=function(a) private$a <- a,
geta=function() private$a,
func=func # defined in another file
),
private=list(
a=NA,
ifunc=ifunc
)
)

但是,我必须说我不了解这种策略。功能 funcifunc那么两者在顶级环境中都有自己的名字但不起作用 - 它们实际上只在类定义中有意义。如果您对代码重用感兴趣,我认为对象组合或继承就不会那么令人惊讶了。

关于r - 定义调用 R6 对象之外的其他方法的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108541/

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