将函数的输出存储为变量

时间:2015-01-16 17:14:34

标签: r

我想将函数的输出存储为全局环境中的新变量,有什么建议吗?

a <- 4
doubleit <- function(x){
   doubled <- x * 2
}

我想要的是在全局环境中有一个名为 doubled 的变量,其中任何值都是通过 doubleit 输入的。

1 个答案:

答案 0 :(得分:1)

有时,有两个或更多函数可能需要共享某些变量的正当理由,例如保存状态,或在一个函数中设置选项以在将来的函数调用中使用。另一种情况是一个函数将被另一个你不能控制的函数(例如optim)调用,所以你不能让你的函数从函数返回信息来使用后者(它会混淆中间函数)。

虽然有正当理由,但使用全局变量来共享此信息并非最佳方法,并且可能导致难以发现错误,覆盖数据和其他问题。

更好的选择之一是使用面向对象的编程,其中共享信息存储在对象中(并且您可以有多于1个),并且需要共享信息的函数是方法。以下是使用R6包的示例:

> library(R6)
> 
> counter <- R6Class(
+   "counter",
+   public = list(
+       value = 0,
+       inc = function(amount=1) {
+         self$value <- self$value + amount
+       },
+       dec = function(amount=1) {
+         self$value <- self$value - amount
+       }
+     )    
+   )
> 
> c1 <- counter$new()
> c2 <- counter$new()
> 
> c1$value
[1] 0
> (c1$inc())
[1] 1
> (c1$inc())
[1] 2
> (c1$inc(5))
[1] 7
> (c2$inc())
[1] 1
> (c2$inc())
[1] 2
> (c1$dec())
[1] 6
> c1$value
[1] 6
> c2$value
[1] 2
> 

另一个选项(适用于包中的选项,文件句柄等),它具有除函数可以访问的全局环境之外的环境。这是另一个使用这种技术的例子(但请注意,这种方式一次只能有一个计数器)

> myenv <- new.env(parent=emptyenv())
> myenv$value <- 0
> 
> inc <- function(amount=1) {
+   myenv$value <- myenv$value + amount
+ }
> 
> dec <- function(amount=1) {
+   myenv$value <- myenv$value - amount
+ }
> 
> myenv$value
[1] 0
> (inc())
[1] 1
> (inc())
[1] 2
> (inc(3))
[1] 5
> (dec())
[1] 4
> myenv$value
[1] 4

如果新环境在全球环境中,那么您仍然需要小心它不会被覆盖,但如果您选择一个好名字,这通常不是什么大问题。如果这是包的一部分,则新环境进入包命名空间,并且用户不能直接访问(能够被破坏),同时允许函数来回传递信息。