Ako pridať Aktualizovať (Refresh) Tlačidlo aplikácie.R

0

Otázka

Pridala som tlačidlo, ale hodnoty sa automaticky zmeniť, ako som narazila na "Update Objednávku", neviem, ako to opraviť. Mali by byť ako tento:zadajte popis obrázku tuNižšie je môj kód:

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
2021-11-24 05:38:40
2
0

Ukážem vám, ako na prepísanie kódu na získanie tejto aktualizácie správanie, avšak by som chcel tiež získať viete, že táto časť kódu:

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

Je zle z troch dôvodov: (1) objektu amt nie existuje, budete pravdepodobne chcieť input$amt; (2) aj keď ste zmeniť amt na input$amt kód nebude fungovať a dostanete chybové; (3) teraz vás nie sú pomocou SelectInput v ľubovoľné miesto v aplikácii, takže nie je dôvod pre túto časť, ak existujú, ale ako, ja neviem, čo je váš cieľ a ako bude vyzerať finálna aplikácia, nehovorím, že to je všeobecne zlé.

Ok, tak teraz o tejto aktualizácii nájdete tlačidlo. Budeme sústrediť na tento kód:

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

Tu môžete poučiť program, aby sa (znovu)vykreslenie textu pri input$fruitchoice alebo (v druhom riadku), keď input$amt zmena, ale chcete, aby sa (znovu)vykreslenie textu iba vtedy, keď používateľ klikne na tlačidlo, takže budete potrebovať dve veci - po prvé, uistite sa, že používateľ klikne na tlačidlo, a nie je (re)vykresliť text, keď jeden z input$ zmeny. To bude fungovať:

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

Ak chápem, Lesklé správne, isolate() zaisťuje, že text nie je (re)poskytovanie keď input$ zmeny (však to má vnútorne nové hodnoty) a req() zabezpečuje, že input$Update kliklo, a keď kliknete znova, Lesklé recomputes [(re)poskytuje] text. To recomputes, pretože sme nemali používať isolate() na input$Update Myslím.

2021-11-24 09:37:42
0

Tam je pár vecí, ktoré nie je v poriadku vo vašom kóde. Dám trochu vysvetlenie pre každú z nich:

Môžete sa inicializuje s reaktívnou vstupy. Pomocou renderText(input$...) vytvoríte textový výstup, ktorý automaticky aktualizuje, keď váš vstup aktualizácie. Automaticky je problém tu, nechcete, aby. Budeme písať alternatívna metóda, ktorá ukladá vstupy v samostatnom premennej, že sme iba umožniť, aby sa aktualizujú, keď je tlačidlo stlačené. Sme inicializovať, že premenná, tak ako:

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

EventReactive vytvára reaktívne premennej, ktoré môžu byť neskôr použité v kóde. Vo všeobecnosti to, čo chcete použiť v týchto druh scenárov je observeEvent. Môžete to urobiť tak, ako je tento:

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

Teraz máme zoznam premenných pod názvom "rv" a observeEvent že aktualizácie tejto premennej vždy tlačidlo dostane stlačené. Všetko, čo je vľavo urobiť, je vytvoriť renderText čo môžete urobiť tak ako:

output$fruit <- renderText(rv$fruit)
output$amt <- renderText(rv$amt)
2021-11-24 10:22:43

Nie je to zlé správanie dať render* vo vnútri observe alebo reactive? I. e. všeobecne hniezdenie aktívne-reaktívne?
gss

Myslím, že to nie je ideálne. Budem aktualizovať s full pozorovať/reactiveVal odpoveď
Wietse de Vries

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................