有光泽:将reactiveValues传递给conditionalPanel

时间:2014-01-06 10:48:43

标签: javascript r shiny

我可以将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

3 个答案:

答案 0 :(得分:10)

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

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

另一个想法:如果您的用户界面很大程度上依赖于服务器端的计算,您可能需要考虑使用renderUI动态创建(侧边栏)内容。

编辑:顺便说一下,这是@jdharrison在第二次评论中提到的内容。

答案 1 :(得分:3)

您也可以通过渲染文字来实现。 UI:

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()
  })
})

这里的问题是没有verbatimTextOutput它不起作用。您需要将其包含在UI端的某个位置。但是,您可以将其重复用作消息。

编辑:

没有verbatimtext也可以。默认情况下,Shiny在未显示时暂停所有输出。但是,可以通过为特定输出变量设置以下选项来更改此项:

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

在这种情况下,还需要使用verbatimtext(以及相应的rendertext)。

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

答案 2 :(得分:0)

基于上述内容,我发现了一种解决方法,可以同时使用where(供您在应用中的其他位置使用)并将其写入上面建议的输出中。

TableA::find()
->where([TableA.attribute1=1 or TableA.attribute2=1])
->select('*')
->joinWith(['TableB'])
->joinWith(['TableC'])
->joinWith(['TableD'])
->andWhere([(further possible conditions on the other Tables)])
->all()

您现在可以在用户界面中访问reactiveVal