【问题标题】:Parameter object within R packageR包中的参数对象
【发布时间】:2021-04-19 13:38:36
【问题描述】:

我有一个带参数的仿真模型。

而不是将所有参数传递给主函数(这对用户来说很复杂,因为某些参数的尺寸取决于它们自己,例如如果n=2vec_n 的长度为 2),我想要一个内部 PARAMETERS包内的对象,所有功能都可以访问,用户可以更改。

我制作了一个包Test,其中包含两个函数和一个内部列表INTERNAL=list(a=2),它保存在sysdata.rda 中。

test_function<-function(b){
  INTERNAL$a = b
  print(INTERNAL)
  second_function()
}

second_function<-function(){
  print(INTERNAL$a)
}

但是在加载包并运行它时,我得到以下输出:

> test_function(5)
$a
[1] 5

[1] 2

显然,对象本身不会在函数之外发生变化。

如果能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    INTERNAL$a = b 在您的函数中创建INTERNAL 的本地副本,并对其进行修改。既然要修改全局副本,可以使用

    INTERNAL$a <<- b
    

    但这是一个坏主意,并且可能无法在包中工作:在安装包后,您无法修改包中的大多数值。

    对此的替代方法是将INTERNAL 放入一个环境(您可以修改),或者创建一个返回您想要的值的函数,例如

        INTERNAL <- function(a = "default", b = "default") {
          list(a = a, b = b)
        }
    
        INTERNAL(a = 2)
    #> $a
    #> [1] 2
    #> 
    #> $b
    #> [1] "default"
    

    reprex package (v1.0.0) 于 2021-04-19 创建

    你可以结合这两个想法:

    INTERNAL <- local({
        saved <- list(a = "default", b = "default")
        function(...) {
          saved <<- modifyList(saved, list(...))
          saved
        }
    })
    INTERNAL(a = 1)
    #> $a
    #> [1] 1
    #> 
    #> $b
    #> [1] "default"
    INTERNAL(b = 2)
    #> $a
    #> [1] 1
    #> 
    #> $b
    #> [1] 2
    INTERNAL(c = 3)
    #> $a
    #> [1] 1
    #> 
    #> $b
    #> [1] 2
    #> 
    #> $c
    #> [1] 3
    

    reprex package (v1.0.0) 于 2021-04-19 创建

    【讨论】:

    • 谢谢你的作品。有什么理由不使用环境吗?它似乎完全按照我的意愿工作。
    • 只要你知道你在做什么,环境就很好。事实上,这就是我的第二个解决方案所使用的:它只是没有让环境变得明显。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多