2016-01-15 11 views
5

बनाएं मैं सोच रहा था कि चमकदार (और चमकदार) का उपयोग कर पॉपअप संवाद बॉक्स इंटरैक्टिव बनाना संभव है या नहीं।एक पॉपअप संवाद बॉक्स इंटरैक्टिव

उदाहरण के लिए, मेरे पास एक स्ट्रिंग है और मैं इसे बदलना चाहता हूं और एक संवाद बॉक्स करने से पहले यह पूछता हूं कि क्या मैं वास्तव में इसे बदलना चाहता हूं। यदि मैं "हां" कहता हूं, तो यह अन्यथा यह परिवर्तन को त्याग देता है। यहां मेरी कोशिश है लेकिन मुझे दो समस्याएं मिलीं: 1. यदि आप "हां" या "नहीं" पर क्लिक करते हैं, तो कुछ भी नहीं बदलता 2. आपको हमेशा "बंद" के नीचे बॉक्स को बंद करने की आवश्यकता होती है।

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

अन्य प्रस्ताव स्वागत से अधिक हैं !!

उत्तर

6

यहाँ एक प्रस्ताव, मैं मुख्य रूप से बदल गया है 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)) 

अंक की एक जोड़ी:

मैं एक reactiveValues बनाए गए नाम धारण करने के लिए उस व्यक्ति वर्तमान में है। यह उपयोगी है क्योंकि जब आप मोडल बटन पर क्लिक करते हैं तो आप इस मान को अपडेट या अपडेट नहीं कर सकते हैं। आप values$name का उपयोग कर नाम तक पहुंच सकते हैं।

आप toggleModal का उपयोग मोडल बंद करने के लिए एक बार उपयोगकर्ता हाँ पर क्लिक किया या नहीं

+0

मैं वास्तव में आपको धन्यवाद देता हूं! मुझे लगता है कि मैं यही देख रहा था! अब, मैं टॉगलमोडाल का अर्थ बेहतर समझता हूं (दस्तावेज़ीकरण इसके बारे में काफी बेकार है) – Stefano

1

आप conditionalPanel का उपयोग करके ऐसा कुछ कर सकते हैं, तो मैं तत्काल अपडेट का विरोध करने के लिए पूछने के लिए एक बटन जोड़ने का सुझाव दूंगा।

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

प्रस्ताव के लिए धन्यवाद। यह वास्तव में काम करता है और यह समस्या का एक स्मार्ट बाईपास है लेकिन (मेरी राय) दूसरा अधिक प्रत्यक्ष है। – Stefano

1

@NicE एक अच्छा समाधान प्रदान कर सकते हैं। मैं इसके बजाय shinyalert पैकेज का उपयोग करके एक वैकल्पिक समाधान प्रदान करने जा रहा हूं, जो मुझे लगता है कि परिणामों को समझने में आसान परिणाम (अस्वीकरण: मैंने लिखा है कि पैकेज पक्षपातपूर्ण हो सकता है)।

मुख्य अंतर यह है कि मोडल निर्माण अब यूआई में नहीं है और अब बटन पर क्लिक होने पर सर्वर पर किया जाता है। मोडल कॉलबैक फ़ंक्शन का उपयोग यह निर्धारित करने के लिए करता है कि "हाँ" या "नहीं" क्लिक किया गया था या नहीं।

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)) 
संबंधित मुद्दे