-->

类型“闭合”的对象不是R中闪亮subsettable(object of type ‘closure

2019-09-26 05:42发布

我想按钮添加到我的DT(每行一个 - 在第一列)。 当我按一下按钮就应该从DT删除行。 我写了代码:

library(shiny)
library(DT)

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

  server <- function(input, output) {

    values <- reactiveValues(data = NULL)

    values$data <- as.data.frame(
      cbind(c("a", "d", "b", "c", "e", "f"),
        c(1463, 159, 54, 52, 52, 220),
        c(0.7315, 0.0795, 0.027, 0.026, 0.026, 0.11)
      )
    )

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

    df <- reactive({
      data = data.frame(
        Delete = shinyInput(actionButton, nrow(values$data), 'button_', label = "Remove", onclick = 'Shiny.onInputChange(\"select_button\",  this.id)'),
        as.data.frame(values$data),
        stringsAsFactors = FALSE,
        row.names = 1:nrow(values$data)
      )
    })

    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])
      df$data <- df$data[rownames(df$data) != selectedRow, ]
    })

  }
)

但不幸的是我得到的错误: 类型“封”的对象不是subsettable。 值$数据已经留为reactiveValues,因为这仅仅是我的项目的片段,我用它在其他功能。 所以,我怎么能写DF,使我的程序工作?

Answer 1:

究其原因,错误是你所说的dfdf$data ,这将是正确的,如果它是一个reactiveValues 。 然而, df是一种反应,它返回只有一个对象,所以你应该只是把它称为df()

对于您的问题,你可以做一个reactiveVal是认为应删除的行。 请注意,您应该调整这一点你自己,例如添加类似observeEvent(values$data, {rows_to_remove(NULL)})所以rows_to_remove()对象重置为NULL输入数据发生变化时。 另一种方法是使整个数据帧一reactiveVal ,并用观察来更新它。

下面的工作例如,希望这有助于!

library(shiny)
library(DT)

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

  server <- function(input, output) {

    values <- reactiveValues(data = NULL)

    values$data <- as.data.frame(
      cbind(c("a", "d", "b", "c", "e", "f"),
            c(1463, 159, 54, 52, 52, 220),
            c(0.7315, 0.0795, 0.027, 0.026, 0.026, 0.11)
      )
    )

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


    rows_to_remove <- reactiveVal()

    df <- reactive({
      data = data.frame(
        Delete = shinyInput(actionButton, nrow(values$data), 'button_', label = "Remove", onclick = 'Shiny.onInputChange(\"select_button\",  this.id)'),
        as.data.frame(values$data),
        stringsAsFactors = FALSE,
        row.names = 1:nrow(values$data)
      )
      data[!rownames(data) %in% rows_to_remove(), ]
    })

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

    observeEvent(input$select_button, {
      selectedRow <- as.numeric(strsplit(input$select_button, "_")[[1]][2])
      rows_to_remove(c(rows_to_remove(),selectedRow)) # update the rows to remove
    })

  }
)


文章来源: object of type ‘closure’ is not subsettable in R Shiny