Jak dodać aktualizacja (Aktualizacja) Przycisk do aplikacji.R

0

Pytanie

Dodałem przycisk, ale wartości, automatycznie zmienią się do tego, jak nacisnę "Aktualizacja zamówienia", nie wiem, jak to naprawić. Powinno być tak:wpisz opis obrazu tutaj Poniżej mój kod:

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

Pokażę ci, jak przepisać kod, aby uzyskać takie zachowanie podczas aktualizacji, jednak chciałbym również, aby wiedzieć, że ta część kodu:

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

Jest błędna, z trzech powodów: (1) obiekt amt nie istnieje, prawdopodobnie chcesz input$amt; (2) nawet jeśli zmienisz amt Dla input$amt kod nie będzie działać, a otrzymasz błąd; (3) teraz nie używasz SelectInput w dowolnym miejscu w aplikacji, więc dla istnienia tej części nie ma powodów, jednak, ponieważ nie wiem, jaki jest twój cel i jak będzie wyglądać program docelowy, ja nie mówię, że to jest w ogóle źle.

Dobra, teraz o ten przycisk aktualizacji. Skupimy się na tym kodzie:

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

Tutaj podajesz programu (ponownie)wyświetlać tekst, gdy input$fruitchoice lub (w drugim wierszu), gdy input$amt zmienić, ale chcesz ponownie wyświetlić tekst tylko wtedy, gdy użytkownik kliknie przycisk, więc trzeba dwie rzeczy: po pierwsze, upewnij się, że użytkownik kliknął przycisk i (ponowne)wyświetlać tekst, gdy jeden z input$ Zmiany. To zadziała:

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

Jeśli dobrze rozumiem, Błyszczący, isolate() gwarantuje, że tekst nie jest (ponownie)pojawia się, gdy input$ zmiany (jednak ma wewnętrzne nowe wartości) i req() gwarantuje, że input$Update był wciśnięty; i kiedy jest wciśnięty ponownie, Shiny przelicza [(ponownie)wyświetla] tekst. On się dostosuje, bo nie wykorzystaliśmy isolate() na input$Update Myślę.

2021-11-24 09:37:42
0

W kodzie jest kilka błędów. Dam małe wyjaśnienie każdego z nich:

Można инициализируетесь za pomocą reaktywnych danych wejściowych. Z pomocą renderText(input$...) tworzysz tekstowy wniosek, który jest automatycznie aktualizowana podczas aktualizacji tekstu. W tym problem, przecież tego nie chcesz. Chcemy napisać metodę alternatywną, która przechowuje dane wejściowe w osobnej zmiennej, którą pozwalamy aktualizować tylko po naciśnięciu przycisku. Jesteśmy инициализируем tę zmienną w następujący sposób:

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

EventReactive tworzy reaktywne zmienną, którą później będzie można wykorzystać w kodzie. Ogólnie, to, co chcesz używać w takich sytuacjach, to observeEvent. Można zrobić to tak:

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

Teraz mamy listę zmiennych pod nazwą "rv" i observeEvent to aktualizuje tę zmienną za każdym razem po naciśnięciu przycisku. Wszystko, co pozostaje zrobić, to stworzyć renderText co można zrobić tak:

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

Czy nie jest to niewłaściwe zachowanie, aby umieścić render* wewnątrz observe lub reactive? Czyli normalnie gniazdowania aktywny-bierny?
gss

Myślę, że to nie jest idealne. Ja uaktualnię pełna odpowiedź na obserwacji/reaktywacji
Wietse de Vries

W innych językach

Ta strona jest w innych językach

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