1

我是 R 新手,在理解所谓的“环境”和正确使用它们的方法方面遇到了一些麻烦。我在 R 语言中非常想念的是静态变量(比如在 Java 中)。

我正在编写一个带有几个函数的程序,这些函数需要在第一次运行时进行初始化。为了为每个函数实现这一点,我创建了只能由这个特定函数访问的新环境(例如,“f1”只能从“myfunction1”内部访问)。

我不喜欢我的解决方案是在函数体之外还有一些额外的代码,而且它不太可读。有没有更简单的方法来实现同样的目标?如果是,那么如果您能提供修改后的示例来向我展示它是如何工作的,那就太好了。谢谢你。

f1 <- new.env()
f1$initialized <- FALSE
f1$o <- NULL
f1$length <- NULL
f1$compute

myfunction1 <- function(x) {
  if(f1$initialized == FALSE){
    f1$initialized <- TRUE
    f1$compute <- 2*pi^2+3
  }
  if(is.null(f1$length) || f1$length!=length(x)){
    f1$length <- length(x)
    if(f1$length==2) {f1$o<-read.table("data_1.txt")}
    else {f1$o<-read.table("data_2.txt")}
  }
  print("Lets print something!")
  return(f1$o * f1$compute * x + 1000)
}
4

1 回答 1

0

如果您熟悉 Java,那么使用RefrenceClasses可能是一个不错的方法。这似乎可以满足您的需求:

myclass <- setRefClass('myclass', fields = list(initilized = 'logical',
                                 o = 'data.frame',
                                 len = 'numeric',
                                 compute = 'numeric'))

#constructor
myclass$methods(initialize = function(initialized, len){
initilized <<- initialized    
len <<- len    
})

#method
myclass$methods(myfunction1 = function(x){
if(initilized == FALSE){
    initilized <<- TRUE
    compute <<- 2*pi^2+3
}    
if(is.null(len) || len != length(x)){
    len <<- length(x)
    if(len==2) {o <<- read.table("data_1.txt")}
    else {o <<- read.table("data_2.txt")}
}
print("Lets print something!")
return(o * compute * x + 1000)
})

obj <- myclass$new(FALSE, 0)
obj$myfunction1(2)

查看?ReferenceClasses这里发生的事情的信息(更多的 OOP 风格并且对类继承有一些支持,这听起来就像你想要的那样)。

于 2013-04-26T21:37:12.483 回答