从两个R会话同时访问环境

jan*_*cki 21 r shiny r6

R在技术上是否可行?

我想用准备好的R6对象(环境类)运行一个闪亮的实例,使用它的方法 - 大多数只读.
虽然在闪亮的应用程序运行的同时我想调用我的R6的其他方法 - 读/写.
Shiny R会话可以是我的R6对象的主机,而第二个会话将从R控制台以预定的R脚本/交互方式调用.
目前我认为我可以做的是直接从闪烁的按钮中获取R脚本,但这限制了交互性.

Stu*_*rys 1

本文介绍了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)
Run Code Online (Sandbox Code Playgroud)