2013-04-26 64 views
1

我是R新手,在理解所谓的“环境”和正确使用它们的方法时遇到了一些麻烦。我在R语言中错过了很多静态变量(如Java)。如何在第一次运行或输入更改时初始化R函数

我正在编写一个程序,其中有一些函数需要在第一次运行时初始化。为了实现这个功能,我创建了一个新的环境,这个环境只能被这个特定的功能访问(例如“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) 
} 
+0

你可能会发现在这样的环境下工作时存在'exists'和'assign'功能 – James 2013-04-26 13:37:56

+0

OTOH,除非你需要在全局环境中隐藏'f1',为什么呢?你可以很容易(我认为...)在'myfunction1'中放入一些'load'或'source'调用来获得保存文件中的任何对象。 – 2013-04-26 15:05:43

回答

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的风格,并拥有一流的继承,这听起来像你想要的要多一些支持)。