【问题标题】:shiny: passing reactiveValues to conditionalPanel闪亮:将反应值传递给条件面板
【发布时间】:2014-01-23 18:12:28
【问题描述】:

我可以将 reactiveValues 传递给 conditionalPanel 的条件吗?如果有,怎么做?

这是我在 conditionalPanel ui.R 中尝试过的:

conditionalPanel(condition = "values.cond == 0", etc.

我在 server.R 中定义了values$cond

values <- reactiveValues(cond = 0)

我也尝试过像"values.cond == true" 这样的替代方法,但没有成功。

library("shiny")
runGist("https://gist.github.com/anonymous/8281021")

查看代码:

https://gist.github.com/anonymous/8281021

【问题讨论】:

  • 请注意,我对我发布的应用程序有一个解决方法,即使用条件condition = "input.action % 2 == 0",所以我的问题实际上仅限于此:我可以将values$cond 传递给条件面板,是或否?谢谢!
  • 我想你是在问反应值是否暴露给客户端。除了输入和输出对象,我认为它们不是。
  • 我明白了,有没有一种简单的方法可以将 reactiveValues$cond 传递给条件面板会读取的 output$cond2 ?喜欢通过 renderText 或 renderPrint 或其他方式?谢谢!
  • 你可以通过这种方式传递它,或者你可以使用例如session$sendCustomMessage来执行一个java脚本调用
  • 好的,谢谢 jd,我会调查一下(目前在 google 上找不到很多)!

标签: javascript r shiny


【解决方案1】:

正如@jdharrison 指出的那样,您有问题,您在服务器端有反应性values 或任何其他数据,而条件面板是 JS 条件 + 客户端上的一些 HTML。因此,如果您想根据您在服务器端计算的某个值动态更新 JS 条件,您需要从服务器获取数据到客户端。我认为您可以做的是使用闪亮的仍未记录的功能将自定义数据从服务器传递到客户端。我写了一篇关于如何做到这一点的博客文章:http://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

我猜你可以使用这种方法来动态更新 JS 面板条件。您需要编写一个 JS 函数,在数据传递后执行此操作。所以这归结为用您想要的值替换conditionalPanel 输出的data-display-if 属性。

另一个想法:如果您的 UI 强烈依赖于服务器端的计算,您可能需要考虑使用 renderUI 动态创建(侧边栏)内容。

编辑:顺便说一句,@jdharrison 在他的第二条评论中提到了这一点。

【讨论】:

  • 很棒的博文,谢谢,我需要一段时间来处理它;-) 我现在的底线是忘记在条件面板中使用 reactiveValues。
【解决方案2】:

你也可以通过渲染文本来做到这一点。

用户界面:

shinyUI(
  fluidPage(
    # Application title
    titlePanel("Test"),

    sidebarLayout(
      sidebarPanel(
        actionButton("ShowCond", "Show Conditional Panel"),
        conditionalPanel(
          condition = "output.test=='5'",
          actionButton("CheckFile", "Check file")
        )
      ),
      mainPanel(
        verbatimTextOutput("test")
      )
    )
  )
)

服务器:

shinyServer(function(input, output, session) {
  var <- eventReactive(input$ShowCond, {
    5
  })

  output$test <- renderText({
    var()
  })
})

问题在于,如果没有逐字文本输出,它就无法工作。您需要将它包含在 UI 端的某个位置。但是,您可以将其作为消息重用。

编辑:

没有逐字文本也是可能的。默认情况下,当所有输出未显示时,Shiny 会暂停所有输出。但是,可以通过为特定的输出变量设置以下选项来改变这一点:

outputOptions(output, "test", suspendWhenHidden=FALSE)

在这种情况下,不再需要使用逐字文本(以及相应的渲染文本)。

来源:https://shinydata.wordpress.com/2015/02/02/a-few-things-i-learned-about-shiny-and-reactive-programming/#use-of-isolate-to-prevent-accidental-dependencies

【讨论】:

    【解决方案3】:

    基于上述情况,我找到了一种解决方法,方法是使用 reactiveVal(在您的应用中的其他位置使用)并将其写入输出,如上面建议的那样。

    your_reactive <- reactiveVal(NULL)
    
    # Read input csv file
    output$your_output <- eventReactive(TRUE, {
     
      out <- ""
          
      your_reactive(out) # update server side reactive
      
      return(out)
      
      })
    
    # Make it available on client side
    outputOptions(output, "your_output", suspendWhenHidden = FALSE)
    

    您现在可以在您的用户界面中访问output.your_output

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-23
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多