2016-01-15 26 views
5

Zastanawiam się, czy możliwe jest utworzenie interaktywnego okna dialogowego za pomocą błyszczącego (i shinyBS).Utwórz wyskakujące okienko dialogowe interaktywne

Na przykład mam ciąg znaków i chcę go zmienić, a przed wykonaniem okna dialogowego pojawi się pytanie, czy naprawdę chcę go zmienić. Na wypadek, gdy powiem "tak", robi to inaczej, odrzuca zmianę. Oto moja próba, ale znalazłem dwie kwestie: 1. jeśli klikniesz "tak" lub "nie", nic się nie zmieni 2. zawsze musisz zamknąć okno u dołu "zamknij".

rm(list = ls()) 
library(shiny) 
library(shinyBS) 

name <- "myname" 

ui =fluidPage(
    textOutput("curName"), 
    br(), 
    textInput("newName", "Name of variable:", name), 
    br(), 
    actionButton("BUTnew", "Change"), 
    bsModal("modalnew", "Change name", "BUTnew", size = "small", 
      textOutput("textnew"), 
      actionButton("BUTyes", "Yes"), 
      actionButton("BUTno", "No") 
) 
) 
server = function(input, output, session) { 
    output$curName <- renderText({paste0("Current name: ", name)}) 

    observeEvent(input$BUTnew, { 
    output$textnew <- renderText({paste0("Do you want to change the name?")}) 
    }) 

    observeEvent(input$BUTyes, { 
    name <- input$newName 
    }) 
} 
runApp(list(ui = ui, server = server)) 

Inne propozycje są mile widziane !!

Odpowiedz

6

Oto propozycja, ja głównie zmienił server.R:

library(shiny) 
library(shinyBS) 
ui =fluidPage(
     textOutput("curName"), 
     br(), 
     textInput("newName", "Name of variable:", "myname"), 
     br(), 
     actionButton("BUTnew", "Change"), 
     bsModal("modalnew", "Change name", "BUTnew", size = "small", 
       HTML("Do you want to change the name?"), 
       actionButton("BUTyes", "Yes"), 
       actionButton("BUTno", "No") 
     ) 
) 
server = function(input, output, session) { 
     values <- reactiveValues() 
     values$name <- "myname"; 

     output$curName <- renderText({ 
       paste0("Current name: ", values$name) 
       }) 

     observeEvent(input$BUTyes, { 
       toggleModal(session, "modalnew", toggle = "close") 
       values$name <- input$newName 
     }) 

     observeEvent(input$BUTno, { 
       toggleModal(session, "modalnew", toggle = "close") 
       updateTextInput(session, "newName", value=values$name) 
     }) 
} 
runApp(list(ui = ui, server = server)) 

Kilka punktów:

stworzyłem reactiveValues posiadać nazwę, że osoba aktualnie ma. Jest to przydatne, ponieważ możesz zaktualizować lub nie zaktualizować tej wartości, gdy osoba kliknie przycisk modalny. Dostęp do nazwy można uzyskać za pomocą values$name.

Można użyć toggleModal aby zamknąć modal, gdy użytkownik kliknie na tak lub nie

+0

Naprawdę dziękuję! Sądzę, że tego właśnie szukałem! Teraz również lepiej rozumiem znaczenie toggleModal (dokumentacja jest dość goła) – Stefano

1

Możesz zrobić coś takiego za pomocą conditionalPanel, chciałbym dodatkowo zasugerować dodanie przycisku, aby poprosić o potwierdzenie przeciwne do natychmiastowej aktualizacji.

rm(list = ls()) 
library(shiny) 
library(shinyBS) 

name <- "myname" 

ui = fluidPage(
    uiOutput("curName"), 
    br(), 
    actionButton("BUTnew", "Change"), 
    bsModal("modalnew", "Change name", "BUTnew", size = "small", 
      textOutput("textnew"), 
      radioButtons("change_name", "", choices = list("Yes" = 1, "No" = 2, "I dont know" = 3),selected = 2), 
      conditionalPanel(condition = "input.change_name == '1'",textInput("new_name", "Enter New Name:", ""))  
    ) 
) 
) 

server = function(input, output, session) { 

    output$curName <- renderUI({textInput("my_name", "Current name: ", name)}) 

    observeEvent(input$BUTnew, { 
    output$textnew <- renderText({paste0("Do you want to change the name?")}) 
    }) 

    observe({ 
    input$BUTnew 
    if(input$change_name == '1'){ 
     if(input$new_name != ""){ 
     output$curName <- renderUI({textInput("my_name", "Current name: ", input$new_name)}) 
     } 
     else{ 
     output$curName <- renderUI({textInput("my_name", "Current name: ", name)}) 
     } 
    } 
    }) 
} 

runApp(list(ui = ui, server = server)) 

enter image description here

+0

Dzięki za propozycję. to faktycznie działa i jest to inteligentne obejście problemu, ale (moim zdaniem) drugie jest bardziej bezpośrednie. – Stefano

1

@NicE warunkiem piękny rozwiązanie. Mam zamiar zaproponować alternatywne rozwiązanie, używając pakietu shinyalert, co moim zdaniem skutkuje łatwiejszym zrozumieniem kodu (uwaga: napisałem, że pakiet może być stronniczy).

Główną różnicą jest to, że tworzenie modalne nie jest już w interfejsie użytkownika, a teraz odbywa się na serwerze po kliknięciu przycisku. Modal używa funkcji wywołania zwrotnego do określenia, czy kliknięto "tak" czy "nie".

library(shiny) 
library(shinyalert) 

ui <- fluidPage(
    useShinyalert(), 
    textOutput("curName"), 
    br(), 
    textInput("newName", "Name of variable:", "myname"), 
    br(), 
    actionButton("BUTnew", "Change") 
) 
server = function(input, output, session) { 
    values <- reactiveValues() 
    values$name <- "myname" 

    output$curName <- renderText({ 
    paste0("Current name: ", values$name) 
    }) 

    observeEvent(input$BUTnew, { 
    shinyalert("Change name", "Do you want to change the name?", 
       confirmButtonText = "Yes", showCancelButton = TRUE, 
       cancelButtonText = "No", callbackR = modalCallback) 
    }) 

    modalCallback <- function(value) { 
    if (value == TRUE) { 
     values$name <- input$newName 
    } else { 
     updateTextInput(session, "newName", value=values$name) 
    } 
    } 
} 
runApp(list(ui = ui, server = server)) 
Powiązane problemy