在 R 中技术上可行吗?
我想用准备好的 R6 对象(环境类)运行一个闪亮的实例,使用它的方法 - 主要是只读的。
在运行闪亮的应用程序的同时,我想调用我的 R6 的其他方法 - 读/写。
闪亮的 R 会话可以是我的 R6 对象的主机,而第二个会话将从预定的 R 脚本/从 R 控制台以交互方式调用。
目前我认为我可以做的是直接从按钮下的闪亮获取 R 脚本,但这限制了交互性。
本文介绍了Shiny 应用程序的范围规则以及如何使用各种打包的代码定义全局数据。下面是我的一个全局变量的例子,它保存了多个会话可以访问的数据。
运行此应用程序,然后在浏览器中打开第二个选项卡/窗口并将其指向同一连接。您可以在一个会话中单击 +1 按钮以增加共享的最大值和本地计数。在另一个会话中,您不会看到任何更改,直到触发闪亮重新检查共享数据,但单击 +1 按钮将更新本地计数,但也会触发共享最大数据值的更新。您可以多次单击 +1 按钮,直到获得新的最大值,然后返回第一个窗口,您可以看到最大值也可见,一旦您单击 +1 按钮触发更新。这适用于多个窗口。
您必须做一些事情来使会话再次检查数据以进行更新。我没有太努力地做到这一点而没有副作用。应该有一些方法可以根据您想要的任何触发器进行“刷新”。你甚至可以使用定时轮询来保持数据同步,就像这个例子对文件所做的那样。
这个例子的一个警告是我只尝试了一个本地 RStudio 闪亮的服务器实现。我不知道它在真实服务器上是这样工作的。如果没有,请对此发表评论!它可能不会在 shinyapps.io 或任何类型的云/负载平衡上以这种方式工作,因为您不能保证两个会话在一台机器上共享一个应用程序实例。
library(shiny)
globalMax <- 0
app <- shinyApp(
ui= pageWithSidebar(
headerPanel("Shared data demo"),
sidebarPanel(
actionButton("plusButton", "+1")
),
mainPanel(
verbatimTextOutput("sharedMax")
)
),
server= function(input,output){
observe({
if (input$plusButton > globalMax) {
globalMax <<- input$plusButton
}
})
output$sharedMax <- renderText({
paste0( "Shared max value: ", globalMax, "\n",
"Local value: ", input$plusButton)
})
}
)
runApp(app)
我想我意外地做了你想做的事——基本上是 2 个 RStudio 会话并行运行?在我的 Mac 上,我只需右键单击 RStudio 并选择 New RStudio Window。我也在 Windows 上做过,但无法访问一个 atm - 应该是相似的。运行 2 个会话允许您在调整第二个实例时保留并参考原始版本。使用 2 台显示器,这对于加快开发时间的挑剔细节非常方便;)