【问题标题】:delete verbatimtextOutput删除逐字输出
【发布时间】:2017-10-18 11:43:21
【问题描述】:

在教授学生闪亮编程时遇到了这个奇怪的问题。

我想要的是编写删除 verbatimtextOuput 元素的代码,而不是打印一个空值

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

谢谢!

应用程序:

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( ) 行,应用程序会在第一次删除它后突然停止重新创建逐字文本输出。 希望我能了解为什么会这样。谢谢!

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

})
}

【问题讨论】:

  • 我认为你也需要一些教学,因为你的代码有很多问题!
  • 好的,第一次感谢您的回答,第二次我知道我远非完美,我自己仍在学习和努力,所以我有时会以奇怪的方式编码。这是一个简单的错误,我的版本有括号,我的学生版本没有。老实说,我没有发现他的代码中没有大括号,是的,你确实需要这些,我总是使用它们
  • @Ben,嘿,谢谢你的链接。我不会称之为教学。我自己仍然是一个学习者,但我必须向我的同事展示我的代码在我正在构建的程序中是如何工作的

标签: r shiny


【解决方案1】:

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)

【讨论】:

  • 感谢req。和stopifnot()类似吗?
  • stopifnot 评估您提供的每个表达式,然后检查所有表达式是否为真,这可能会停止闪亮应用程序。另一方面,req"try-error" 类型的类,它应该会捕获您的错误
  • 我一定会研究风格规则,看起来很棒。在编码方面,我是一个自学成才的人,并且仍在学习以“正确”的方式在这里和那里做事。您的答案在 clickonme2 和 clickonme3 的 observeEvent 下具有相同的代码,将其更改为运行它。我知道 req to确保有一个变量,如果没有就停止。在这种情况下我不明白的是:values$name 在服务器创建后就存在(特别是如果编码为 values$name
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 2022-08-14
  • 2017-05-19
  • 2013-12-31
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多