Shiny 中的 Reactive Dataframes 问题

Trouble with Reactive Dataframes in Shiny

这是minimal reproducible example:

# This is a Shiny web application. 

library(shiny)

# UI for application
ui <- fluidPage(
    
    # Application title
    titlePanel("A Problematic App - Part 2"),
    
    # Sidebar with two slider inputs
    sidebarLayout(
        sidebarPanel(
            sliderInput(
                "NoOfSamples",
                label = "Sample Size",
                value = 100,
                min = 10,
                max = 150,
                step = 10,
                width = "40%"
            ),
            sliderInput(
                "KeepSamples",
                label = "Samples to Keep",
                value = 50,
                min = 10,
                max = 150,
                step = 10,
                width = "40%"
            )
        ),
        
        # Shows the resulting table
        mainPanel(
            tableOutput("table1"),
            tableOutput("table2")
        )
    )
)

# Server logic
server <- function(input, output) {
    
    # Using the iris dataset
    datExpr <- as.data.frame(iris)
    
    n = reactive({
        input$NoOfSamples
    })
    datExpr0 <- reactive({
        datExpr[1:n(), ]
    })
    output$table1 <- renderTable({
        datExpr0()
    })
    # Displays the first table correctly if the rest is commented out
    keepSamples = reactive({
        input$KeepSamples
    })
    datExpr <- reactive({
        datExpr0()[keepSamples(),]
    })
    output$table2 <- renderTable({
        datExpr()
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

我已经创建了用于演示的实例。

错误是object of type 'closure' is not subsettable。虽然存在许多关于此错误的问题(和答案),但我还没有找到任何解释上述行为的方法。

为什么会发生这种情况?

正常(等效脚本)按预期工作。

datExpr <- as.data.frame(iris)
n = 50
datExpr0 <- datExpr[1:n, ]
datExpr0
keepSamples = 10
datExpr <- datExpr0[keepSamples,]
datExpr

有没有办法在闪亮的应用程序中实现普通脚本的功能?

问题是您的应用程序中有一个数据框和一个名为 datExpr 的反应式。只需重命名两者之一(我决定使用反应式)​​。

编辑 shiny.

当然没有什么特别的

一个简单的例子来说明这个问题:

datExpr <- iris
datExpr <- function() {}
datExpr[1:2]
#> Error in datExpr[1:2]: object of type 'closure' is not subsettable

你看我们也得到了著名的 object of type 'closure' is not subsettable error。一般的问题或教训是,在 R 中你不能同时拥有两个同名的不同对象。

# This is a Shiny web application. 

library(shiny)

# UI for application
ui <- fluidPage(
  
  # Application title
  titlePanel("A Problematic App - Part 2"),
  
  # Sidebar with two slider inputs
  sidebarLayout(
    sidebarPanel(
      sliderInput(
        "NoOfSamples",
        label = "Sample Size",
        value = 100,
        min = 10,
        max = 150,
        step = 10,
        width = "40%"
      ),
      sliderInput(
        "KeepSamples",
        label = "Samples to Keep",
        value = 50,
        min = 10,
        max = 150,
        step = 10,
        width = "40%"
      )
    ),
    
    # Shows the resulting table
    mainPanel(
      tableOutput("table1"),
      tableOutput("table2")
    )
  )
)

# Server logic
server <- function(input, output) {
  
  # Using the iris dataset
  datExpr <- as.data.frame(iris)
  
  n = reactive({
    input$NoOfSamples
  })
  datExpr0 <- reactive({
    datExpr[1:n(), ]
  })
  output$table1 <- renderTable({
    datExpr0()
  })
  # Displays the first table correctly if the rest is commented out
  keepSamples = reactive({
    input$KeepSamples
  })
  datExpr1 <- reactive({
    datExpr0()[keepSamples(),]
  })
  output$table2 <- renderTable({
    datExpr1()
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
#> 
#> Listening on http://127.0.0.1:3648