2017-08-17 13 views
4

データテーブルを持つR Shiny Appがあります。 1つの列には、固有のIDを持つアクションボタンが含まれています。これらのボタンのクリックを処理したいのですが、残念ながらイベント処理コード(単純なprint文)は決して実行されません。私が使用している R Shiny:データテーブル内の操作ボタンを処理します。

  • パスを単に間違っている

    1. 私が使用しているパス(input$employees$x$data$actions[[id]]):私は2つの可能性のある問題を参照してください

      library(shiny) 
      library(DT) 
      
      ui <- shinyUI(
          fluidPage(
           title = "DataTable with Buttons", 
           fluidRow(
            column(
             width = 8, 
             dataTableOutput("employees") 
            ) 
           ) 
          ) 
      ) 
      
      server <- shinyServer(function(input, output) { 
          df <- data.frame(
           name = c('Dilbert', 'Alice', 'Wally', 'Ashok', 'Dogbert'), 
           motivation = c(62, 73, 3, 99, 52), 
           stringsAsFactors = FALSE 
          ) 
          fireButtons <- list() 
          fireButtonIds <- list() 
          for (r in rownames(df)) { 
           id <- paste("fire_", r, sep = "") 
           fireButtonIds[[r]] <- id 
           button <- actionButton(id, label = "Fire") 
           fireButtons[[r]] <- as.character(button) 
          } 
          df$actions <- fireButtons 
          dt <- datatable(df, colnames = c("#", "Name", "Motivation", "Actions")) 
          output$employees <- renderDataTable(dt) 
      
      
          for (id in fireButtonIds) { 
           # binding doesn't work 
           # - is the path wrong? 
           # - is it because the button is really a string, not an object? 
           observeEvent(input$employees$x$data$actions[[id]], { 
            print(paste("click on", i)) 
           }) 
          } 
      }) 
      
      shinyApp(ui = ui, server = server) 
      

      :この自己完結型の例(app.R)を参照してください。 でも、は実際に処理できるものを指していません。つまり、HTML文字列であり、ボタンオブジェクトではありません。

    また、データテーブルの中にボタンを入れるのに適していますか?

  • 答えて

    7

    これは、実行しようとしていることを達成していますか?

    library(shiny) 
    library(DT) 
    
    shinyApp(
        ui <- fluidPage(
        DT::dataTableOutput("data"), 
        textOutput('myText') 
    ), 
    
        server <- function(input, output) { 
    
        myValue <- reactiveValues(employee = '') 
    
        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(
    
         Name = c('Dilbert', 'Alice', 'Wally', 'Ashok', 'Dogbert'), 
         Motivation = c(62, 73, 3, 99, 52), 
         Actions = shinyInput(actionButton, 5, 'button_', label = "Fire", onclick = 'Shiny.onInputChange(\"select_button\", this.id)'), 
         stringsAsFactors = FALSE, 
         row.names = 1:5 
        )) 
    
    
        output$data <- DT::renderDataTable(
         df$data, server = FALSE, escape = FALSE, selection = 'none' 
        ) 
    
        observeEvent(input$select_button, { 
         selectedRow <- as.numeric(strsplit(input$select_button, "_")[[1]][2]) 
         myValue$employee <<- paste('click on ',df$data[selectedRow,1]) 
        }) 
    
    
        output$myText <- renderText({ 
    
         myValue$employee 
    
        }) 
    
        } 
    ) 
    
    +0

    はい、あります。私はまだコードを完全に理解する必要がありますが、意図したとおりに動作します。ありがとうございました! –

    +2

    説明が不十分で申し訳ありません。サーバーコードで最初に作成される機能は、&名前の入力を作成する機能です。次に、この関数を使用して、反応的なデータフレームに列を作成します。そのデータフレームはDT出力に配置され、UIに表示されます。イベントハンドラ関数(observeEvent)は、select_button(私たちが作成した5)がヒットしたときにいつでも反応します。この場合、リアクティブ値(myValue $ employee)が従業員の行ID名に一致するように変更されます。その値はmyText出力に渡され、UIでレンダリングされます。希望は意味をなさない! – kostr

    +0

    同じボタンを2回クリックしても、実際には起動しません。そのための修正? –

    関連する問題