example() You can see and -6ren">
gpt4 book ai didi

r - local()与R中其他关闭方法有何不同?

转载 作者:行者123 更新时间:2023-12-03 14:52:34 24 4
gpt4 key购买 nike

昨天我从Bill Venables了解到local()如何帮助创建静态函数和变量,例如

example <- local({
hidden.x <- "You can't see me!"
hidden.fn <- function(){
cat("\"hidden.fn()\"")
}
function(){
cat("You can see and call example()\n")
cat("but you can't see hidden.x\n")
cat("and you can't call ")
hidden.fn()
cat("\n")
}
})


在命令提示符下的行为如下:

> ls()
[1] "example"
> example()
You can see and call example()
but you can't see hidden.x
and you can't call "hidden.fn()"
> hidden.x
Error: object 'hidden.x' not found
> hidden.fn()
Error: could not find function "hidden.fn"


我已经在 Static Variables in R中讨论了这种情况,其中采用了不同的方法。

这两种方法的优缺点是什么?

最佳答案

封装形式

这种编程风格的优势在于,隐藏的对象不会被其他任何东西覆盖,因此您可以更加确信它们包含您的想法。由于不会轻易访问它们,因此不会被错误使用。在该问题的链接文章中,有一个全局变量count,可以从任何地方访问和覆盖它,因此,如果我们调试代码并查看count并看到其更改,我们实际上不能确定哪一部分的代码已更改它。相反,在问题的示例代码中,我们有更大的保证,即不涉及代码的其他部分。

注意,实际上我们可以访问隐藏函数,尽管它并不那么简单:

# run hidden.fn
environment(example)$hidden.fn()


面向对象编程

还要注意,这与面向对象的编程非常接近,其中 examplehidden.fn是方法,而 hidden.x是属性。我们可以这样做,使之明确:

library(proto)
p <- proto(x = "x",
fn = function(.) cat(' "fn()"\n '),
example = function(.) .$fn()
)
p$example() # prints "fn()"


proto不会隐藏 xfn,但是错误地访问它们并不容易,因为您必须使用 p$xp$fn()来访问它们,这与能够编写 e <- environment(example); e$hidden.fn()并没有太大的不同

编辑:

面向对象的方法确实增加了继承的可能性,例如可以定义 p的子元素,该子元素的作用类似于 p,但它会覆盖 fn

ch <- p$proto(fn = function(.) cat("Hello from ch\n")) # child
ch$example() # prints: Hello from ch

关于r - local()与R中其他关闭方法有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901916/

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