【问题标题】:How to make a package set up protected variables in R?如何使包在 R 中设置受保护的变量?
【发布时间】:2020-06-26 14:22:39
【问题描述】:

我正在尝试使用函数 createShinyApp 创建一个 R 包 mypckg。后一个函数应该创建一个目录结构,准备在某个位置用作闪亮的应用程序。在这个新创建的闪亮应用程序中,我有一些变量,应该从闪亮应用程序中访问,而不是由用户直接访问(以防止用户意外覆盖它们)。这些变量存在的原因(我知道不应该使用全局变量)是闪亮的应用程序正在处理文本语料库,我想避免在许多函数之间传递(并因此复制)它,因为这可能会导致用尽记忆。使用mypckg 的人应该能够设置这些变量,然后再使用createShinyApp。

到目前为止我的想法是:

  1. 我让mypckg::createShinyApp 将受保护的变量保存在protectedVariables.rds 文件中,并让shinyApp 将此文件中的变量加载到新环境中。我对环境不是很有经验,所以我还不能让它正常工作,因为到目前为止,在运行闪亮的应用程序时无法创建新环境。
  2. 我让mypckg::createShinyApp 将受保护的变量保存在protectedVariables.rds 文件中,并让shinyApp 将此文件中的变量加载到选项中。此后,我将访问变量并使用 options() 和 getOption 设置变量。

这些想法的优缺点是什么?还有更简单、更优雅的方法来实现我的目标吗?

【问题讨论】:

    标签: r shiny global-variables environment r-package


    【解决方案1】:

    如果没有看到您正在使用的变量和上下文的具体示例,理解这种情况有点困难,但我会尝试回答。

    首先:在 R 中,实现对变量的 100% 保护是非常非常困难的。即使在闪亮中,闪亮的作者也尝试建立许多机制来禁止某些变量被用户覆盖(例如 input 变量),虽然它确实使它变得更加困难,但你应该知道这是不可能的,或者至少是极其困难的,实际上阻止了更改变量的所有方式。

    有了免责声明,我假设您会对防止人们意外覆盖变量的东西感到满意,但如果他们故意不这样做,那就这样吧。在这种情况下,您当然可以按照您的建议从 RDS 文件中读取变量(需要注意的是,用户当然可以覆盖该文件)。您还可以使用全局包级变量——通常谈论全局变量是不好的,但在包的上下文中这是很常见的事情。

    例如,您可以在包中的globals.R 文件中定义:

    .mypkgenv <- new.env(parent = emptyenv())
    .mypkgenv$var1 <- "some variable"
    .mypkgenv$var2 <- "some other variable"
    

    闪亮的应用程序可以访问这些使用

    mypckg:::.mypkgenv$var1
    

    这只是一种方式,还有其他方式

    【讨论】:

    • 这很有帮助。其他方法是什么?
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2015-08-11
    • 2020-12-07
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2014-06-24
    • 2011-08-02
    相关资源
    最近更新 更多