2017-02-27 4 views
1

RStudio 1.0.136とR Shiny 0.14.2を使用して、各行にアクションボタンを持つデータテーブルを作成しようとしています。ポップアップが表示されます。同じボタンを2回連続してクリックできないということを除いて、私のコードは現在動作しています。Rシャイニー:Datatable内のボタンをクリックして2回ポップアップを表示する

library(shiny) 
library(DT) 
library(shinyBS) 

shinyApp(
ui <- fluidPage(
DT::dataTableOutput("data"), 

uiOutput("modal") 
), 

server <- function(input, output,session) { 

shinyInput <- function(FUN, len, id, ...) { 
    inputs <- character(len) 
    for (i in seq_len(len)) { 
    inputs[i] <- as.character(FUN(paste0(id, i), ...)) 
} 
    inputs 
} 

df <- reactiveValues(data = data.frame(
    Assessment = shinyInput(actionButton, 10, 'button_', label = "Assessment", onclick = 'Shiny.onInputChange(\"select_button\", this.id)'), 
    Value1 = 1:10, 
    Value2 = c("A", "B", "C", "D", "E"), 
    stringsAsFactors = FALSE, 
    row.names = 1:10 
)) 

output$data <- DT::renderDataTable(
    df$data, server = FALSE, escape = FALSE, selection = 'none' 
) 


observeEvent(input$select_button, { 
    s <- as.numeric(strsplit(input$select_button, "_")[[1]][2]) 
    output$modal <- renderUI({ 
tagList(
bsModal(paste('model', s ,sep=''), "Assessment", "select_button", size = "small", 
      textAreaInput("text", label = h3("Enter Assessment") , value = "", width = "100%", height = "200px", resize = "none"), 
      actionButton("Enter", "Enter") 
    )) 
    }) 
    toggleModal(session,paste('model', s ,sep=''), toggle = "Assessment") 

})  
}) 

第二のコードは次のとおりです:ポップアップで入力された何

library(shiny) 
library(DT) 
library(shinyBS) 

shinyApp(
ui <- fluidPage(
DT::dataTableOutput("data"), 
bsModal("modalnew", "Assessment", "select_button", size = "small", 
     textAreaInput("text", label = h3("Enter Assessment") , value = "",  width = "100%", height = "200px", resize = "none"), 
     actionButton("Enter", "Enter") 
) 

), 

server <- function(input, output,session) { 

shinyInput <- function(FUN, len, id, ...) { 
    inputs <- character(len) 
    for (i in seq_len(len)) { 
    inputs[i] <- as.character(FUN(paste0(id, i), ...)) 
} 
    inputs 
} 

df <- reactiveValues(data = data.frame(
    Assessment = shinyInput(actionButton, 10, 'button_', label = "Assessment", onclick = 'Shiny.onInputChange(\"select_button\", this.id)'), 
    Value1 = 1:10, 
    Value2 = c("A", "B", "C", "D", "E"), 
    stringsAsFactors = FALSE, 
    row.names = 1:10 
)) 

output$data <- DT::renderDataTable(
    df$data, server = FALSE, escape = FALSE, selection = 'none' 
) 

observeEvent(input$select_button, { 
    s <- as.numeric(strsplit(input$select_button, "_")[[1]][2]) 
    toggleModal(session, "modalnew", toggle = "close") 
}) 
}) 

が、現在は無関係である私は、以下の例のコードの2つのバージョンを掲載しています。同じボタンを2回連続してクリックできるようにする方法についてのご意見は、大歓迎です。

+0

新しい選択時にボタンの機能をリセットする必要があります。そうしないと、以前にクリックされた行が「覚えています」。また、 'shinyInput'をサーバの外に置いてください。一度だけレンダリングする必要があります –

+0

observeEventの中で入力$ select_button < - NULLをリセットしようとしましたが、動作していないようです。ボタンの機能をリセットする別の方法はありますか? – Jamie

答えて

2

私はあなたのコードを変更しました。私はthisリンクからのjs関数を使用してselect_buttonの値をリセットしました。

library(shiny) 
library(DT) 
library(shinyBS) 


shinyApp(
    ui <- fluidPage(

    shinyjs::useShinyjs(), 
    #js function to reset a button, variableName is the button name whose value we want to reset 
    tags$script("Shiny.addCustomMessageHandler('resetInputValue', function(variableName){ 
       Shiny.onInputChange(variableName, null); 
       }); 
       "), 
    DT::dataTableOutput("data"), 

    uiOutput("modal") 
), 

    server <- function(input, output,session) { 

    shinyInput <- function(FUN, len, id, ...) { 
     inputs <- character(len) 
     for (i in seq_len(len)) { 
     inputs[i] <- as.character(FUN(paste0(id, i), ...)) 
     } 
     inputs 
    } 

    df <- reactiveValues(data = data.frame(
     Assessment = shinyInput(actionButton, 10, 'button_', label = "Assessment", onclick = 'Shiny.onInputChange(\"select_button\", this.id)'), 
     Value1 = 1:10, 
     Value2 = c("A", "B", "C", "D", "E"), 
     stringsAsFactors = FALSE, 
     row.names = 1:10 
    )) 

    output$data <- DT::renderDataTable(
     df$data, server = FALSE, escape = FALSE, selection = 'none' 
    ) 


    observeEvent(input$select_button, { 
     s <- as.numeric(strsplit(input$select_button, "_")[[1]][2]) 
     output$modal <- renderUI({ 
     tagList(
      bsModal(paste('model', s ,sep=''), "Assessment", "select_button", size = "small", 
        textAreaInput("text", label = h3("Enter Assessment") , value = "", width = "100%", height = "200px", resize = "none"), 
        actionButton("Enter", "Enter") 
     )) 
     }) 
     toggleModal(session,paste('model', s ,sep=''), toggle = "Assessment") 
     ##Reset the select_button 
     session$sendCustomMessage(type = 'resetInputValue', message = "select_button") 
    })  
    }) 

希望します。

+0

これは完全に動作しています、ありがとう! – Jamie

+0

素晴らしい作品です!ありがとう – CrossValidatedTrading

関連する問題