【问题标题】:R shiny conditionalPanel output valueR闪亮的条件面板输出值
【发布时间】:2014-03-03 18:48:51
【问题描述】:

关于conditionalPanel in R shiny 有很多问题,但我仍然不明白如何将 server.R 创建的值用于conditionalPanel。这是我想做的事情:我有一个类似http://some-url.com/php/session_check.php?sid=session_id 的网址。当session_id 以 0 开头时,例如http://some-url.com/php/session_check.php?sid=00221245,将返回带有用户名的字符串(例如“testuser”)。当 session_id 以除 0 以外的任何其他数字开头时,例如 http://some-url.com/php/session_check.php?sid=10221245,返回 0。现在我想隐藏一个面板,具体取决于返回的是 0 还是用户名。因此我尝试做这样的事情:

conditionalPanel(
 condition="output.disable_ui!=0"

我知道这是错误的,但我真的不明白condition 参数对outputs 的作用,因为如果我对来自ui.R 的任何input 执行此操作,同样会起作用。

这是我的示例代码:

server.R

library(shiny)
library(raster)
library(rgdal)

shinyServer(function(input, output, clientData) {

  output$disable_ui<-reactive({
    query<-parseQueryString(clientData$url_search)
    url_path<-paste(sep="","http://some-url.com/php/session_check.php?sid=",query, collapse="")
    read.table(url_path)
  })

  data <- reactive({  
    inFile <- input$example_layer 

    if (is.null(inFile)) 
      return(NULL)
    raster.file<- raster(inFile$datapath) 
  })

  output$raster.plot <- renderPrint({
    "Nothing to see here"
  })
})

ui.R

library(shiny)

shinyUI(pageWithSidebar(

  headerPanel("test"),

  sidebarPanel(
    conditionalPanel(
      condition="output.disable_ui!=0",

    #File Upload
    fileInput('example_layer', 'Choose Raster Layer (ASCII)', multiple=FALSE, accept='asc')

  )),

  mainPanel(
    verbatimTextOutput("raster.plot")
  )
))

【问题讨论】:

  • 如果这可行的话,所有会发生的是文件上传按钮将根据 url 显示(或不显示)。不会上传任何文件。用户在按下按钮后会被要求搜索并选择一个文件。这就是你想要的吗?
  • 这与文件上传按钮无关。我想要的是,当 url 返回“0”时,侧边栏面板甚至所有面板都不会显示,而当 url 返回一些“用户名”时,所有面板都会显示。

标签: r shiny


【解决方案1】:

@Julien Navarre 是对的:必须渲染输出。除非您将其选项 suspendWhenHidden 设置为 FALSE:

  output$disable_ui<-reactive({
    query<-parseQueryString(clientData$url_search)
    url_path<-paste(sep="","http://some-url.com/php/session_check.php?sid=",query, collapse="")
    read.table(url_path)
  })
  outputOptions(output, 'disable_ui', suspendWhenHidden=FALSE)

【讨论】:

  • 能详细描述一下吗? suspendWhenHidden 是做什么的?我只是在我的代码中复制了该行,但它不起作用。但听起来我真的很有趣的解决方案,我想了解。谢谢
  • @user2524906 我不知道技术细节,但具体来说,如果它设置为TRUE,那么只有在渲染时才会“检测到”输出。这是最干净的解决方案。此处的其他示例:stackoverflow.com/questions/19686581/…
  • @StéphaneLaurent 谢谢。
【解决方案2】:

如果你想在conditionalPanel的条件下使用output,我认为必须在UI中呈现它。

以您为例,条件面板的 HTML 将如下所示:

&lt;div data-display-if="output.disable_ui!=0"&gt;

如果您的页面中没有任何元素(在服务器端创建为输出)具有 ID“disable_ui”,则条件“output.disable_ui!=0”始终为 TRUE,并且始终显示条件面板。

一个简单的例子:

shiny::runApp(list( 
  ui = pageWithSidebar(
    
    headerPanel("test"),
    
    sidebarPanel(
      selectInput(
        "var", "Var",
        0:9)),
    
    mainPanel(
      verbatimTextOutput("id"),
      conditionalPanel(
        condition="output.id!=0",
        h4('Visible')
      )
    )
  ),
  server = function(input, output) {
    
    output$id<-reactive({input$var})
    
  }
))

如果您选择一个不同于 0 的数字,将显示条件面板。 现在,注释verbatimTextOutput("id"),这一行,页面中没有id为“id”的元素,那么条件面板&lt;div data-display-if="output.id!=0"&gt;的条件不能为FALSE。

【讨论】:

  • 感谢@Julien Navarre,渲染输出对我有用。
【解决方案3】:

这是这个问题的真正答案: 在你的服务器函数中使用它:

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

然后您就可以在条件面板中使用output.item。

从这里回答: https://github.com/daattali/advanced-shiny/blob/master/server-to-ui-variable/app.R

这里: https://github.com/rstudio/shiny/issues/1318

【讨论】:

猜你喜欢
  • 2016-04-10
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多