删除verbatimtextOutput

时间:2017-10-18 11:43:21

标签: r shiny

在向学生讲授闪亮的节目时遇到了这个奇怪的问题。

我想要的是制作删除verbatimtextOuput元素的代码,而不是打印空值

这是他编写的代码,但它基本上删除了所有按钮,整个UI。可以这样做吗?我知道更复杂的选项,如条件面板等,但只是想弄清楚为什么removeUI没有做我在这里所期望的。

谢谢!

app:

library(shiny)

ui<-fluidPage(  h5("Hello there"),      #First text on the window
               br(),                            #empty line
               actionButton(inputId = "ClickonMe", label = "Make data"),  # button 1
               actionButton(inputId = "ClickonMe2", label = "Print data"), # button 2
               actionButton(inputId = "ClickonMe3", label = "Transform data"),

               verbatimTextOutput("Response_text")  #reactive text output    )

server <- function(input,output) {
     values <- reactiveValues()
     observeEvent(input$ClickonMe,
               values$name <- TRUE   )
     observeEvent(input$ClickonMe3,
               if (values$name == TRUE) { values$name <- FALSE}
               else { values$name <- TRUE}   )
     observeEvent(input$ClickonMe2,
               if (values$name == TRUE) { output$Response_text <- renderPrint( isolate({values$name}) ) }
               else  if (values$name == FALSE)  {  removeUI(
                 selector = "div:has(> #Response_text)"
               )
               }

  )    }

shinyApp(ui, server)

编辑版本:

更改了猪排的答案,以便此版本删除并重新制作ui中的逐字素。 我现在试图完全理解的是,为什么片段req(....)有这样的影响。 print(values $ name)证明变量存在,并且观察者看到它,但是如果你#req()行,app会在第一次删除后立即停止重新创建verbatimtextouput。 希望我能理解为什么会这样。谢谢!

library(shiny)

ui <- fluidPage(  
  h5("Hello there"),                                          # First text on the window
  br(),                                                       # empty line
  actionButton(inputId = "ClickonMe", label = "Make data"),   # button 1
  actionButton(inputId = "ClickonMe2", label = "Print data"), # button 2
  actionButton(inputId = "ClickonMe3", label = "Transform data"),
  mainPanel(verbatimTextOutput("Response_text"))
)

server <- function(input,output,session) {
  values <- reactiveValues()
  values$name <- T

  observeEvent(input$ClickonMe,{
    values$name <- T 
  })

  observeEvent(input$ClickonMe3,{
    if (values$name){ values$name <- F}
    else{ values$name <- T }
  })

  observeEvent(input$ClickonMe2,{

    print(values$name)
  output$Response_text <- renderPrint({ isolate({ 

    req(values$name)
    if(!values$name){
      removeUI(
        selector = "div:has(> #Response_text)"
      )
    }else {
    as.character(values$name)}
  })
      })

})
}

1 个答案:

答案 0 :(得分:3)

1)首先,请在编写代码时查看Google's R Style Guide并尝试坚持下去,我认为您和您的学生都将从中受益。

2)使用observeEventrenderPrint

等功能时也使用花括号

3)熟悉req功能非常方便

示例代码如何删除UI:

library(shiny)

ui <- fluidPage(  
  h5("Hello there"),                                          # First text on the window
  br(),                                                       # empty line
  actionButton(inputId = "ClickonMe", label = "Make data"),   # button 1
  actionButton(inputId = "ClickonMe2", label = "Print data"), # button 2
  actionButton(inputId = "ClickonMe3", label = "Transform data"),
  mainPanel(verbatimTextOutput("Response_text"))
)

server <- function(input,output,session) {
  values <- reactiveValues()
  values$name <- NULL

  observeEvent(input$ClickonMe,{
    values$name <- T 
  })

  observeEvent(input$ClickonMe3,{
    if (values$name){ 
      values$name <- F}
    else{
      values$name <- T
    }
  })

  observeEvent(input$ClickonMe2,{
    if (values$name){ 
      values$name <- F
      }
    else{
      values$name <- T
    }
  })

  output$Response_text <- renderPrint({
    req(values$name)
    if(!values$name){
      removeUI(
        selector = "div:has(> #Response_text)"
      )
    }
    as.character(values$name)})
}

shinyApp(ui, server)

enter image description here