【问题标题】:How to add Update (Refresh) Button to the app.R如何将更新(刷新)按钮添加到 app.R
【发布时间】:2021-11-24 05:38:40
【问题描述】:

我添加了按钮,但值会在我点击“更新订单”之前自动更改,我不知道如何修复它。应该是这样的:enter image description here下面是我的代码:

library(shiny)
ui <- fluidPage(
 titlePanel("My Simple App"),
 
 sidebarLayout(
   sidebarPanel(
     helpText("Controls for my app"),
     
     selectInput("fruitchoice", 
                 label = "Choose a fruit",
                 choices = list("Apples", 
                                "Oranges",
                                "Mangos", 
                                "Pomegranate"),
                 selected = "Percent White"),
     
     sliderInput("amt", 
                 label = "Order Amount:",
                 min=0, max = 100, value=20),
     
     actionButton ("Update","Update Order")
   ),
   
   mainPanel(
     helpText("Fruit Chosen:"),
     verbatimTextOutput("fruit"),
     helpText("Order Amount"),
     verbatimTextOutput("amt")
   )
 )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

   SelectInput <- eventReactive (input$Update , {
   runif(input$fruitchoice,amt)
  })
   output$fruit = renderText(input$fruitchoice)
   output$amt = renderText(input$amt)
}
# Run the application 
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我会告诉你,如何重写你的代码来获得这个更新行为,但是我也想让你知道这部分代码:

    SelectInput <- eventReactive (input$Update , {
       runif(input$fruitchoice,amt)
      })
    

    错误有三个原因:(1)对象amt不存在,你可能想要input$amt; (2) 即使你将amt 更改为input$amt 代码也不起作用,你会得到错误; (3) 现在您没有在应用程序的任何地方使用SelectInput,所以这部分没有理由存在,但是由于我不知道您的目标是什么以及最终应用程序的外观,我我不是说这通常是错误的。

    好的,现在关于这个更新按钮。我们将重点关注这段代码:

    output$fruit = renderText(input$fruitchoice)
       output$amt = renderText(input$amt)
    

    在这里,您指示程序在input$fruitchoice 或(在第二行)input$amt 更改时(重新)呈现文本,但是您只想在用户单击按钮时(重新)呈现文本,所以您需要两件事- 首先,确保用户单击了按钮并且当input$ 之一发生更改时不要(重新)呈现文本。这将起作用:

    output$fruit = renderText({
        req(input$Update)
        isolate(input$fruitchoice)
        })
      output$amt = renderText({
        req(input$Update)
        isolate(input$amt)
        })
    

    如果我对 Shiny 的理解正确,isolate() 确保在 input$ 更改时不会(重新)呈现文本(但它在内部具有新值),req() 确保点击了 input$Update;当再次单击时,Shiny 重新计算 [(re)renders] 文本。它会重新计算,因为我认为我们没有在 input$Update 上使用 isolate()

    【讨论】:

      【解决方案2】:

      您的代码中存在一些问题。我会为每一个做一点解释:

      您正在使用响应式输入进行初始化。通过使用renderText(input$...),您可以创建一个文本输出,该输出会在您的输入更新时自动更新。自动是这里的问题,你不想要那个。我们将编写一个替代方法,将输入存储在一个单独的变量中,我们只允许在按下按钮时更新该变量。我们像这样初始化那个变量:

      rv <- reactiveValues(fruit = "Apples",
                             amt = 20)
      

      EventReactive 创建一个反应变量,以后可以在代码中使用。一般来说,你想在这些场景中使用的是observeEvent。你可以这样做:

      observeEvent (input$Update , {
          rv$fruit <- input$fruitchoice
          rv$amt <- input$amt
        })
      

      我们现在有一个名为“rv”的变量列表和一个observeEvent,每次按下按钮时都会更新这个变量。剩下要做的就是创建renderText,您可以这样做:

      output$fruit <- renderText(rv$fruit)
      output$amt <- renderText(rv$amt)
      

      【讨论】:

      • render* 放在observereactive 中不是错误的行为吗? IE。一般嵌套主动-反应式?
      • 我想这并不理想。我将更新完整的观察/反应值答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多