【问题标题】:Reactive variable cannot be rendered automatically in R Shiny反应变量无法在 R Shiny 中自动呈现
【发布时间】:2022-01-02 22:24:25
【问题描述】:

我正在用 R 语言的 Shiny 写一个在线表格,但是一些令人困惑的事情阻止了我。

我需要的是:

  1. 首次显示完整表格。
  2. 如果您在输入块中输入一个数字并提交,只需自动显示表格的前 n 行。

我看到的是:

DFflt,表格后面的变量,提交后已经更改,但是在手动刷新页面之前无法重新加载网页上的表格。

我可以做些什么来解决这个问题?谢谢!

library(shiny)
library(tidyverse)

DF <- mpg
DFflt <- mpg

ui <- fluidPage(
  numericInput("nrow", "Slice the top n rows of DF", value = 0),
  actionButton("submit", "Submit"),
  actionButton("p_DFflt", "print DFflt in console"),
  div('render DFflt:'),
  tableOutput("table")
  )
server <- function(input, output, session) {

  observeEvent(input$submit, {
    nrow <- input$nrow
    if (nrow > 10) {
      showNotification(str_c("Invalid", type="error")) }
    else { DFflt <<- DF %>% head(nrow) }
  })
  
  observeEvent(input$p_DFflt, { print(DFflt)} )
  
  output$table <- renderTable({DFflt})
}

shinyApp(ui, server)

【问题讨论】:

  • 问题是您将 DFlft 定义为全局变量而不是反应变量(即 eventReactive() 或 reactive() 或 reactiveValues())。我建议你查看一些关于闪亮反应性的教程,你应该很容易解决你的问题
  • 我想第一次显示完整的表格,所以我必须定义一个全局的DFflt 或设置一个默认的最大值nrow 并使DFflt 成为一个反应变量。后者有点丑所以我选择前者。有没有其他方法可以实现这个目标?

标签: r shiny tidyverse shiny-reactivity


【解决方案1】:

这应该可以按您的预期工作:

library(shiny)
library(tidyverse)

DF <- mpg

ui <- fluidPage(
  numericInput("nrow", "Slice the top n rows of DF", value = 0),
  actionButton("submit", "Submit"),
  actionButton("p_DFflt", "print DFflt in console"),
  div('render DFflt:'),
  tableOutput("table")
)
server <- function(input, output, session) {
  
  n_row <- eventReactive(input$submit, {
    input$nrow
  })

  observe({
    if (n_row() > 10) {
    showNotification(str_c("Invalid ", type="error")) 
    }
  })

  output$table <- renderTable({
    if(input$submit == 0){ #  when the submit button is not clicked
      DF
    }else{
      if (n_row() >= 0 & n_row() <= 10) {
        DF %>% head(n_row())
      }
    }
  })
 
 observeEvent(input$p_DFflt, { print(DF)} )
}

shinyApp(ui, server)

【讨论】:

  • 感谢您的回答,现在表格可以自动刷新了。我想第一次显示完整的表格,我该怎么办?
  • 然后需要一个if 语句来检查提交按钮是否被按下。修改后的代码见renderTable({ })
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多