Jak přidat Aktualizace (Refresh) Tlačítko aplikace.R

0

Otázka

Přidal jsem tlačítko, ale hodnoty se automaticky změní předtím, než jsem hit "Aktualizovat Objednávku", nevím, jak to opravit. Měly by být takhle:zadejte popis obrázku zde,Níže 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ážu vám, jak přepsat svůj kód, aby si tuto aktualizaci chování, nicméně rád bych se také dostat vědět, že tato část kódu:

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

Je špatně ze tří důvodů: (1) předmět amt neexistuje, pravděpodobně budete chtít input$amt; (2) i když změníte amt k input$amt kód nebude fungovat a budete mít chybu; (3) nyní nepoužíváte SelectInput v každém místě v aplikaci, takže není žádný důvod, aby tato část existuje, ale jako nevím, co je vaším cílem a jak bude vypadat konečný aplikace, neříkám, že to je obecně špatně.

Ok, takže teď o to tlačítko aktualizovat. Zaměříme se na tento kód:

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

Tady dáte pokyn programu, aby (znovu)vykreslit text, když input$fruitchoice nebo (v druhém řádku), když input$amt změnit, ale chcete (znovu)činí pouze text, když uživatel klepne na tlačítko, takže budete potřebovat dvě věci - za prvé, ujistěte se, že uživatel kliknul na tlačítko a ne (re)vykreslení textu, když jeden z input$ změny. To bude fungovat:

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

Pokud chápu, Lesklé správně, isolate() je si jistý, že text není (re)při vykreslování input$ změny (nicméně to má interně nové hodnoty) a req() je si jistý, že input$Update bylo kliknuto, a když kliknete znovu, Lesklé recomputes [(re)vykreslí] text. To recomputes, protože jsme nepoužili isolate() na input$Update Myslím, že.

2021-11-24 09:37:42
0

Je tam pár věcí špatně v kódu. Jsem se dát trochu vysvětlení pro každou z nich:

Jste inicializaci s reaktivní vstupy. Pomocí renderText(input$...) můžete vytvořit textový výstup, který se automaticky aktualizuje, když vaše vstupní aktualizace. Automaticky je zde problém, že nechceš že. Budeme psát alternativní metoda, která ukládá vstupy do samostatné proměnné, které jsme pouze umožnit, aby být aktualizovány, když je stisknuto tlačítko. Jsme inicializovat, že tak jako proměnnou:

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

EventReactive vytváří reaktivní proměnné, které mohou být později použity v kódu. Obecně řečeno, co chcete použít v těchto situacích je observeEvent. Můžete to udělat tak, jako tento:

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

Nyní máme seznam proměnných pod názvem "karavan" a observeEvent které aktualizace tato proměnná pokaždé, když se tlačítko dostane lisované. Vše, co zbývá udělat, je vytvořit renderText které můžete udělat jako tak:

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

Není to špatné chování, aby se dal render* uvnitř observe nebo reactive? I. e. obecně hnízdění aktivní-reaktivní?
gss

Myslím, že to není ideální. Budu aktualizovat s plnou pozorovat/reactiveVal odpověď
Wietse de Vries

V jiných jazycích

Tato stránka je v jiných jazycích

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