2016-01-15 30 views
5

Tôi đã tự hỏi liệu có thể tạo hộp thoại bật lên tương tác bằng cách sử dụng sáng bóng (và shinyBS) hay không.Tạo hộp thoại bật lên tương tác

Ví dụ, tôi có một chuỗi và tôi muốn thay đổi nó và trước khi làm một hộp thoại xuất hiện hỏi tôi có thực sự muốn thay đổi nó hay không. Trong trường hợp tôi nói "có", nếu không, nó sẽ loại bỏ thay đổi. Đây là thử của tôi nhưng tôi thấy hai vấn đề: 1. nếu bạn bấm vào "có" hoặc "không", không có gì thay đổi 2. bạn luôn luôn cần phải đóng hộp bằng "đóng" dưới cùng.

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

Các đề xuất khác được hoan nghênh hơn !!

Trả lời

6

Dưới đây là một đề xuất, tôi chủ yếu là thay đổi 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)) 

Một vài điểm:

Tôi tạo ra một reactiveValues giữ tên mà người đó hiện có. Điều này rất hữu ích vì bạn có thể cập nhật hoặc không cập nhật giá trị này khi người đó nhấp vào nút phương thức. Bạn có thể truy cập tên bằng cách sử dụng values$name.

Bạn có thể sử dụng toggleModal để đóng modal khi người dùng đã nhấp vào có hoặc không

+0

Tôi thực sự cảm ơn bạn! Tôi đoán đó là những gì tôi đang tìm kiếm! Bây giờ, tôi cũng hiểu rõ hơn ý nghĩa của toggleModal (tài liệu khá trống về nó) – Stefano

1

Bạn có thể làm điều gì đó như thế này bằng cách sử dụng conditionalPanel, tôi sẽ đề xuất thêm một nút để yêu cầu xác nhận phản đối việc cập nhật tức thì.

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

Cảm ơn đề xuất. nó thực sự làm việc ra và nó là một bỏ qua thông minh của vấn đề nhưng (ý kiến ​​của tôi) khác là trực tiếp hơn. – Stefano

1

@NicE cung cấp một giải pháp tốt đẹp. Tôi sẽ cung cấp một giải pháp thay thế bằng cách sử dụng gói shinyalert thay vào đó, mà tôi tin rằng kết quả trong dễ hiểu mã (từ chối trách nhiệm: Tôi đã viết gói đó có thể được thiên vị).

Sự khác biệt chính là tạo phương thức không còn trong giao diện người dùng và hiện được thực hiện trên máy chủ khi nút được nhấp. Phương thức sử dụng chức năng gọi lại để xác định xem "có" hay "không" đã được nhấp.

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)) 
Các vấn đề liên quan