【问题标题】:How to get rid of this error message 'closure' is not subsettable' in R shiny如何在 R Shiny 中摆脱此错误消息“closure”不是子集的
【发布时间】:2021-11-30 00:24:21
【问题描述】:

我正在创建一个 R 闪亮的应用程序,它以 CSV 文件作为输入并具有三个选项:

  1. “浏览”以加载 CSV 文件

  2. “SplitColumn”会从合并列中删除空格,我的 CSV 有时可能会合并列。

  3. 'Replace' 和 'By' 用于替换特定的列值。

  4. 'Columns List' 上面所有三个函数都使用列列表中的列名来工作。

问题: 问题是我不断收到消息“‘闭包’类型的对象不是子集的。”我怎样才能摆脱这个错误,以便我可以使用上面列出的所有功能?

有人可以帮我解决这个问题吗?

CSV 示例

ID  Type  Category    Range
21  A1B1              100
22  C1D1              200
23  E1F1              300

使用“Split column”和“Repalce”“BY”按钮后的预期结果

ID  Type  Category    Range
21  A1     B1          5000
22  C1     D1          200
23  E1     F1          300

app.R

library(shiny)
library(reshape2)
library(DT)
library(tibble)
library(tidyverse)


###function for deleting the rows
splitColumn <- function(data, column_name) {
  newColNames <- c("Unmerged_type1", "Unmerged_type2")
  newCols <- colsplit(data[[column_name]], " ", newColNames)
  after_merge <- cbind(data, newCols)
  after_merge[[column_name]] <- NULL
  after_merge
}



ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose CSV File", accept = ".csv"),
      checkboxInput("header", "Header", TRUE),
      actionButton("Splitcolumn", "SplitColumn", class = "btn-warning" ),
      uiOutput("selectUI"),
      selectInput("col", "Columns List:", NULL),
      textInput("old", "Replace:"),
      textInput("new", "By:"),
      actionButton("replace", "Replace!"),
      
      
    ),
    mainPanel(
      DTOutput("table1")
    )
  )
)

server <- function(input, output, session) {
  rv <- reactiveVal(NULL)
  
  observeEvent(input$file1, {
    file <- input$file1
    ext <- tools::file_ext(file$datapath)
    req(file)
    validate(need(ext == "csv", "Please upload a csv file"))
    
    rv$orig <- read.csv(file$datapath, header = input$header)
    rv$data <- rv$orig
    updateSelectInput(session, "splitcolumn", choices = names(rv$data()))
  })
  
  observeEvent(input$replace, {
    req(input$splitcolumn)
    dat <- req(rv$data())
    traf <- if (is.numeric(dat[[input$Splitcolumn]])) as.numeric else identity
    rv$data(dat %>%
              mutate(!!rlang::sym(input$Splitcolumn) := 
                       replace(!!rlang::sym(input$Splitcolumn),
                               as.character(!!rlang::sym(input$Splitcolumn)) == input$old,
                               input$new) %>% 
                       traf()))
  })
  
  output$table1 <- renderDT(
    req(rv$data())
  )
  
  observeEvent(input$Splitcolumn, {
    rv$data <- splitColumn(rv$data, input$selectcolumn)
  })
}
shinyApp(ui, server)

【问题讨论】:

  • rv$data() 有效吗? data 在这种情况下应该是什么?
  • @dario,rv$data,正在引用 csv 输出
  • 但是rv$datarv$data() 完全不一样。第一个引用一个称为“数据”的元素,第二个引用一个函数。然后在其他地方,您尝试在函数调用中使用 names 方法 - 不确定 that 应该做什么
  • @dario,因为我是 R Shiny 的新手,你能帮我解决这个错误吗?
  • 我不会教你闪亮的......我已经给出了一些提示和问题,你可以从检查它们开始。如果您是 R 新手,我强烈建议您在尝试构建闪亮的应用程序之前先学习基础知识

标签: r shiny rscript


【解决方案1】:

reactiveVal 只创建一个(单个)反应值。 IE。在rv$orig 之类的情况下,它不是可子集的。请改用reactiveValues

取自手册:

# Create the object with no values
values <- reactiveValues()

# Assign values to 'a' and 'b'
values$a <- 3
values[['b']] <- 4

## Not run: 
# From within a reactive context, you can access values with:
values$a
values[['a']]

【讨论】:

  • 我很抱歉,但我不知道你想说什么。
  • @KevinTracey 请仔细阅读 Jan 给你的答案 - 没有任何暗示你应该硬编码任何东西。
  • @dario,是的。我会阅读答案...非常感谢您的反馈。
  • @Jan,对于没有阅读您的回复,请接受我的歉意。感谢您的回复,我了解到reactivevalues() 是如何在 r shiny 中使用的。
  • 没有伤害。有趣的问题是:当您将rv 指定为reactiveValues 而不是reactiveVal 时,它是否有效?
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多