-1

列の 1 つに selectInput ウィジェットを持つデータテーブルを作成しました。データテーブルの別の列は、最初の列で指定された入力を受け取り、それらを使用してデータ ソースから数値を検索する必要があります。入力は、preDrawCallback および drawCallback 関数を使用して Shiny で正しくバインドされていますが、入力が変更されたときにルックアップ値が更新されません。奇妙なことに、別のデータ テーブルでルックアップを行うと更新されます。再現可能な例は次のとおりです。

library(shiny)
library(DT)

data <- data.frame(c(1:7),c(21:27))

shinyApp(
  server = shinyServer(function(input, output) {
      output$table <- DT::renderDataTable({

        Rows <- c(1:7)
        temp <- data.frame(Rows)  
        temp[,"Item"] <- ""
        temp[,"Value"] <- ""
        temp$Rows <- NULL

        sapply(1:7, FUN = function(i) {
          temp$Item[i] <<- as.character(selectInput(paste("Item.1.1",i, sep = "."), "",
                                                       choices = setNames(c(1:7),c(1:7)),
                                                       selected = 1,
                                                       multiple = FALSE))
        })

         sapply(1:7, FUN = function(i) {
           temp$Value[i] <<- data[eval(parse(text = paste("input$Item.1.1",i, sep = "."))),2]
         })

        datatable(temp, escape = FALSE, rownames = FALSE,
                  options = list(sort = FALSE, paging = FALSE, searching = FALSE, dom = 't',
                                 columnDefs = list(list(className = 'dt-center', targets = 0:1)),
                                 preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
                                 drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
                  ))
    }, server = FALSE)
  }),
  ui = fluidPage(
    dataTableOutput("table")
  )
)

「temp$Value[i] のエラー <<- data[eval(parse(text = paste("input$Item.1.1", : replacement has length zero)」というエラーが表示されます。

これをサーバーに追加しようとしました:

test <- reactive({
              data.frame(c(ifelse(is.null(input$Item.1.1.1),"",data[eval(parse(text = paste("input$Item.1.1",1, sep = "."))),2]),
                ifelse(is.null(input$Item.1.1.2),"",data[input$Item.1.1.2,2]),
                ifelse(is.null(input$Item.1.1.3),"",data[input$Item.1.1.3,2]),
                ifelse(is.null(input$Item.1.1.4),"",data[input$Item.1.1.4,2]),
                ifelse(is.null(input$Item.1.1.5),"",data[input$Item.1.1.5,2]),
                ifelse(is.null(input$Item.1.1.6),"",data[input$Item.1.1.6,2]),
                ifelse(is.null(input$Item.1.1.7),"",data[input$Item.1.1.7,2])))
            })

次に、renderDataTable 内の適切な sapply をコメント アウトし、代わりに temp[,"Value"] <-test() を割り当てると、データ テーブルの 2 番目の列に 21 が表示され、selectInputs が変更されても変化しません。

テストとして、UI の対応する dataTableOutput() と組み合わせて、これをサーブに含めてみました。

             output$test1 <- DT::renderDataTable({
               test()
             })

test1 は、2 番目の sapply が renderDataTable 内でコメント化されている場合にのみ、期待どおりに動作します。コメントアウトされていない場合、両方のテーブルに無応答の 21 の列があります。

これは私を一日中バタバタさせていたので、どんな考えでも私の人生を大きく改善するでしょう!

4

1 に答える 1