在一个外观的renderPlot中为renderTable创建一个对象

时间:2015-06-05 15:05:55

标签: r object scope shiny scoping

我正在起草一个简单的Shiny App,它可以访问动态图表和相应的表格。 server.R代码的相关部分如下所示:

output$some_plot<- renderPlot({
    # Subset data on change in the indicator selection
    chrt_demo_dta <- subset(x = dta_la_demo, 
                            subset = <<my-conditions>>>)
    # Define the demography chart
    ggplot(data = chrt_demo_dta, aes(x = variable_a, y = variable_b)) +
      geom_line(aes(colour = GEOGRAPHY_NAME), size = 2) +
      theme_bw()}, height = 650, width = 800)

  # Section generating table
  output$chrt_demo_dta_tbl <- renderTable({chrt_demo_dta})

当我尝试访问表时出现问题我收到以下错误消息:

  

func()中的错误:找不到对象'chrt_demo_dta'

对象chrt_demo_dta似乎是在renderTable的范围规则之外创建的。我的问题是如何实现以下目标:

  1. 我希望图表和相应的表格在选择时动态更新,因此我想在subset中嵌入renderPlot命令
  2. 我想在相应的表中使用相同的子集。理想情况下,我想避免重复子命令。由于我已准备好所需的数据框,因此只需通过renderTable
  3. 访问它即可。

    我知道代码不是完全可重现的,但在这个阶段我不一定要寻找特定的解决方案,而是更通用的指导,是否可以访问在一个服务器元素中创建的对象来自其他服务器元素。如果推动推动,我可以在一个函数中封装子集化机制并调用它两次,但它似乎是相当混乱的解决方案。

2 个答案:

答案 0 :(得分:0)

&lt;&lt; - 运营商可能会产生不良后果。它将结果发送到共享环境,在该环境中,会话的所有用户都可以看到它。这不仅会造成他们试图互相覆盖的竞争条件,还可能会将机密工作暴露给他人。您有两个解决方案:1)重复每个本地环境中的步骤,2)使用唯一名称(例如Sys.time()+数据哈希)将结果写入磁盘。然后你可以在其他地方需要时检索它。不要忘记删除已保存的文件,否则您的存储空间将被消耗。

答案 1 :(得分:0)

server的{​​{1}}功能中:

server.R

查看相关内容:Shiny : How to modify reactive object