【问题标题】:Simultaneously access environment from two R sessions从两个 R 会话同时访问环境
【发布时间】:2015-07-08 18:50:42
【问题描述】:

在 R 中技术上可行吗?

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

【问题讨论】:

  • 我不确定我是否理解正确,但我认为您可能在描述并行化?
  • @Roland 2 并行连接到 R6 类做完全不同的事情。一个连接也可以是交互式 R 控制台。
  • 如果我理解正确,您可以每隔一段时间将环境保存到服务器,或者在事件/观察时保存。在您的其他会话中,您可以加载该保存的对象。
  • 你不能这样做——process isolation 会处理这个问题。听起来你想要的是inter-process communication。然而,在最基本的情况下,也许可以考虑简单地将您的更改持久化到文件或数据库中。
  • 没有骰子。当然,您可以查看其他 IPC 模式:套接字或命名管道可能比写入文件更快。内存映射文件也比原始文件更快,因为省略了序列化开销。

标签: r shiny r6


【解决方案1】:

本文介绍了scoping rules for Shiny apps 以及如何使用各种打包代码定义全局数据。下面是我的一个全局变量的例子,它保存了多个会话可以访问的数据。

运行此应用,然后在浏览器中打开第二个选项卡/窗口并将其指向同一连接。您可以在一个会话中单击 +1 按钮以增加共享的最大值和本地计数。在另一个会话中,您不会看到任何更改,直到触发闪亮重新检查共享数据,但单击 +1 按钮将更新本地计数,但也会触发共享最大数据值的更新。您可以在此处多次单击 +1 按钮,直到获得新的最大值,然后返回第一个窗口,您可以在单击 +1 按钮触发更新后看到最大值也可见。这适用于多个窗口。

您必须做一些事情 让会话再次检查数据以进行更新。我没有太努力地做到这一点而没有副作用。应该有一些方法可以根据您想要的任何触发器进行“刷新”。您甚至可以使用定时轮询来保持数据同步,就像 this example 对文件所做的那样。

这个例子的一个警告是我只尝试了一个本地 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)

【讨论】:

  • 当它已经在运行时,我应该如何从单独的 R 控制台连接到它?
  • 所有代码共享数据必须在同一个应用中。 Web 浏览器会话仅共享内部数据,因为它们连接到同一个应用程序(同一个 url)。如果您通过 url 连接使其像浏览器/网络抓取工具一样,则可以从控制台进行连接,但如果您希望它从应用程序“输出”并进入其他东西,数据将通过网络连接流式传输。
  • 接受它作为答案,我希望它涵盖如果你让它像浏览器/网络抓取工具一样,你可以从控制台连接。这实际上是重点 - 如何连接到正在运行的应用程序并更改它使用的数据而不从数据库重新加载。 PS。我有 1 个 Web 浏览器会话和 1 个 R 控制台会话,因此对多个 Web 会话之间共享的数据并不真正感兴趣。
【解决方案2】:

我想我无意中做了你想做的事——基本上是 2 个 RStudio 会话并行运行?在我的 Mac 上,我只需右键单击 RStudio 并选择 New RStudio Window。我也在 Windows 上做过,但无法访问一个 atm - 应该是相似的。 运行 2 个会话允许您在调整第二个实例时保留并参考原始版本。使用 2 个显示器,这对于加快开发时间来处理挑剔的细节非常方便;)

【讨论】:

  • 我想说这不是 OP 想知道的,他要求在闪亮的服务器中的两个 R 会话之间共享数据(而不是启动两个 RStudio 实例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多