如何使包在 R 中设置受保护的变量?
How to make a package set up protected variables in R?
我正在尝试创建一个带有函数 createShinyApp
的 R 包 mypckg
。后一个函数应该创建一个目录结构,可以在某个位置用作闪亮的应用程序。在这个新创建的 shiny 应用程序中,我有一些变量,应该从 shiny 应用程序内部访问,但不能由用户直接访问(以防止用户意外覆盖它们)。这些变量存在的原因(我知道不应该使用全局变量)是闪亮的应用程序正在处理文本语料库,我想避免在许多函数之间传递(并因此复制)它,因为这可能会导致耗尽记忆。使用 mypckg
的人应该能够设置这些变量,然后再使用 createShinyApp
.
目前我的想法是:
- 我让
mypckg::createShinyApp
将受保护的变量保存在 protectedVariables.rds
文件中,并让 shinyApp 将此文件中的变量加载到新环境中。我对环境不是很有经验,所以我还不能让它正常工作,因为到目前为止,创建一个新环境还没有在 运行 一个闪亮的应用程序上工作。
- 我让
mypckg::createShinyApp
将受保护的变量保存在 protectedVariables.rds
文件中,并让 shinyApp 将此文件中的变量加载到选项中。此后,我将访问变量并使用 options() 和 getOption 设置变量。
这些想法的优点和缺点是什么?是否还有更简单、更优雅的方法来实现我的目标?
在没有看到您正在使用它的变量类型和上下文的具体示例的情况下,有点难以理解这种情况,但我会尽力回答。
首先:在R中,要实现100%的变量保护是非常非常困难的。即使在 shiny 中,shiny 的作者也尝试建立很多机制来阻止某些变量被用户覆盖(例如 input
变量),虽然它确实使它变得更加困难,但你应该知道实际上阻止更改变量的所有方式是不可能的,或者至少是极其困难的。
在排除免责声明的情况下,我假设您会对防止人们意外覆盖变量的东西感到满意,但如果他们故意不按自己的方式去做,那就这样吧。在这种情况下,您当然可以像您建议的那样从 RDS 文件中读取变量(需要注意的是,用户当然可以覆盖该文件)。您还可以使用全局包级变量——通常谈论全局变量是不好的,但在包的上下文中这是很常见的事情。
例如,您可以在包中的 globals.R
文件中定义:
.mypkgenv <- new.env(parent = emptyenv())
.mypkgenv$var1 <- "some variable"
.mypkgenv$var2 <- "some other variable"
闪亮的应用程序可以使用
访问这些
mypckg:::.mypkgenv$var1
这只是一种方式,还有其他方式
我正在尝试创建一个带有函数 createShinyApp
的 R 包 mypckg
。后一个函数应该创建一个目录结构,可以在某个位置用作闪亮的应用程序。在这个新创建的 shiny 应用程序中,我有一些变量,应该从 shiny 应用程序内部访问,但不能由用户直接访问(以防止用户意外覆盖它们)。这些变量存在的原因(我知道不应该使用全局变量)是闪亮的应用程序正在处理文本语料库,我想避免在许多函数之间传递(并因此复制)它,因为这可能会导致耗尽记忆。使用 mypckg
的人应该能够设置这些变量,然后再使用 createShinyApp
.
目前我的想法是:
- 我让
mypckg::createShinyApp
将受保护的变量保存在protectedVariables.rds
文件中,并让 shinyApp 将此文件中的变量加载到新环境中。我对环境不是很有经验,所以我还不能让它正常工作,因为到目前为止,创建一个新环境还没有在 运行 一个闪亮的应用程序上工作。 - 我让
mypckg::createShinyApp
将受保护的变量保存在protectedVariables.rds
文件中,并让 shinyApp 将此文件中的变量加载到选项中。此后,我将访问变量并使用 options() 和 getOption 设置变量。
这些想法的优点和缺点是什么?是否还有更简单、更优雅的方法来实现我的目标?
在没有看到您正在使用它的变量类型和上下文的具体示例的情况下,有点难以理解这种情况,但我会尽力回答。
首先:在R中,要实现100%的变量保护是非常非常困难的。即使在 shiny 中,shiny 的作者也尝试建立很多机制来阻止某些变量被用户覆盖(例如 input
变量),虽然它确实使它变得更加困难,但你应该知道实际上阻止更改变量的所有方式是不可能的,或者至少是极其困难的。
在排除免责声明的情况下,我假设您会对防止人们意外覆盖变量的东西感到满意,但如果他们故意不按自己的方式去做,那就这样吧。在这种情况下,您当然可以像您建议的那样从 RDS 文件中读取变量(需要注意的是,用户当然可以覆盖该文件)。您还可以使用全局包级变量——通常谈论全局变量是不好的,但在包的上下文中这是很常见的事情。
例如,您可以在包中的 globals.R
文件中定义:
.mypkgenv <- new.env(parent = emptyenv())
.mypkgenv$var1 <- "some variable"
.mypkgenv$var2 <- "some other variable"
闪亮的应用程序可以使用
访问这些mypckg:::.mypkgenv$var1
这只是一种方式,还有其他方式