Как добавить обновление (Обновить) Кнопка для приложения.R

0

Вопрос

Я добавил кнопку, но значения автоматически изменятся до того, как я нажму "Обновить заказ", я не знаю, как это исправить. Должно быть так:введите описание изображения здесь Ниже мой код:

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

Я покажу вам, как переписать ваш код, чтобы получить такое поведение при обновлении, однако я также хотел бы, чтобы вы знали, что эта часть кода:

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)
    })

Если я правильно понимаю Блестящий, isolate() гарантирует, что текст не (повторно)отображается, когда input$ изменения (однако он имеет внутренне новые значения) и req() гарантирует, что input$Update был нажат; и когда он нажат снова, Shiny пересчитывает [(повторно)отображает] текст. Он пересчитывается, потому что мы не использовали isolate() на input$Update Я думаю.

2021-11-24 09:37:42
0

В вашем коде есть несколько ошибок. Я дам небольшое объяснение каждому из них:

Вы инициализируетесь с помощью реактивных входных данных. С помощью 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)
2021-11-24 10:22:43

Разве это не неправильное поведение, чтобы поставить render* внутри observe или reactive? Т. е. обычно гнездование активно-реактивное?
gss

Я думаю, это не идеально. Я обновлю полный ответ по наблюдению/реактивации
Wietse de Vries

На других языках

Эта страница на других языках

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