2017-07-12 16 views
0

テーブルセルをクリックした後に何か起こったことの機能を追加したいと考えました(例:モーダルを開く)。私の新しいセルをクリックするまでは、input$dt_cell_clickedは同じセルになっているので、そのセルを再度クリックすると同じイベントを実行することができないため、(私のdtにID "dt"があるとします)DataTables DT:クリックしたセルの値をリセットする

私は、手動でinput$dt_cell_clickedをjavascriptでリセットして回避しようとしました。これは動作しますが、以前にセルをクリックしたことに気づいたDTに内部アップデータがあるようですが、クリックされた値にinput$dt_cell_clickedの値を設定しません。回避策はありますか?これはバグですか?

ありがとうございます!

最小例:ここでは

library(shiny) 
library(shinyjs) 

ui <- fluidPage(
    h2("Last clicked:"), 
    verbatimTextOutput("last_clicked"), 
    actionButton("reset", "Reset clicked value"), 
    h2("Datatable:"), 
    DT::dataTableOutput("dt"), 
    useShinyjs(), 
    extendShinyjs(text = paste0("shinyjs.resetDTClick = function() { Shiny.onInputChange('dt_cell_clicked', null); }")) 
) 

server <- function(input, output) { 

    # the last clicke value 
    output$last_clicked <- renderPrint({ 
    str(input$dt_cell_clicked) 
    }) 

    output$dt <- DT::renderDataTable({ 
    DT::datatable(head(mtcars, 2)) 
    }) 

    observeEvent(input$dt_cell_clicked, { 
    validate(need(length(input$dt_cell_clicked) > 0, '')) 
    alert("You clicked something!") 
    }) 

    observeEvent(input$reset, { 
    js$resetDTClick() 
    }) 
} 

shinyApp(ui, server) 
+0

'DT :: selectRows'を使用して行の選択を解除してみてください。 –

+0

これは行の選択ではなく、最後にクリックされた値をリセットすることです:) – shosaco

答えて

0

と共にdataTableProxyを用いてshinyjsから依存関係を除去する:最後に選択されたセルを。この最後に選択されたセルが観察され、新しい選択時に何らかのアクションが実行されます。 DTプロキシを使用して選択をリセットすることができます。

library(shiny) 

ui <- fluidPage(
    h2("Last clicked:"), 
    verbatimTextOutput("last_clicked"), 
    actionButton("reset", "Reset clicked value"), 
    h2("Datatable:"), 
    DT::dataTableOutput("dt") 
) 

server <- function(input, output) { 

    # the last clicked=selected value 
    output$last_clicked <- renderPrint({ 
    str(input$dt_rows_selected) 
    }) 

    output$dt <- DT::renderDataTable({ 
    DT::datatable(head(mtcars, 2), selection = 'single') 
    }) 

    # do some action after selecting a value 
    observeEvent(input$dt_rows_selected, { 
    validate(need(!is.null(input$dt_rows_selected), '')) 
    print("You clicked something!") 
    }) 

    myProxy = DT::dataTableProxy('dt') 

    # reset last selected value using the proxy 
    observeEvent(input$reset, { 
    DT::selectRows(myProxy, NULL) 
    }) 
} 

shinyApp(ui, server) 
0

は正しくリセットをしたバージョンです。リセットボタンを押すたびにNULLに設定される無効値(last)を使用し、この値が更新されるたびにinput$dt_cell_clickedの値をとります。

Iはまた、プロキシ(グレデCillia)を使用してのヒント後、私は迂回を使用して回避策が見出さselectRows

library(shiny) 

ui <- fluidPage(
    h2("Last clicked:"), 
    verbatimTextOutput("last_clicked"), 
    actionButton("reset", "Reset clicked value"), 
    h2("Datatable:"), 
    DT::dataTableOutput("dt") 
) 

server <- function(input, output) { 

    # the last clicke value 
    output$last_clicked <- renderPrint({ 
    str(last()) 
    }) 

    output$dt <- DT::renderDataTable({ 
    DT::datatable(head(mtcars, 2)) 
    }) 

    observeEvent(input$dt_cell_clicked, { 
    validate(need(length(input$dt_cell_clicked) > 0, '')) 
    print("You clicked something!") 
    }) 

    myProxy = DT::dataTableProxy('dt') 
    last = reactiveVal(NULL) 

    observe({ 
    last(input$dt_cell_clicked) 
    }) 

    observeEvent(input$reset, { 
    DT::selectRows(myProxy, NULL) 
    last(NULL) 
    output$dt <- DT::renderDataTable({ # EDIT 
     DT::datatable(head(mtcars, 2))  # EDIT 
    })         # EDIT 
    }) 
} 

shinyApp(ui, server) 
+0

ありがとうございますが、動作の唯一の違いは選択解除です。 'input $ dt_last_cell_clicked'は、ユーザが「リセット」をクリックした後もまだ更新されません。理由は簡単です: 'last'は' NULL'に設定されていますが、 '$ dt_cell_clicked'がリセットされていないので、別のクリックは' last'を更新しません。 – shosaco

+0

なぜ、 'input $ dt_last_cell_clicked'の代わりに' last' *を使用しないのですか?一般的に、( 'DT')APIがサポートしていない限り、入力を更新することは光沢がありません。この値をjavascriptで使用する必要がある場合は別の方法がありますが、私が知る限り、これはあなたの質問の一部ではありません。 –

+0

'last()'がNULLに設定された後、ユーザがDTをクリックすると 'last'は更新されないので、' input $ dt_cell_clicked'はプロセス中に変更されず、 'last () ' – shosaco

関連する問題