R闪亮:“ $。shinyoutput中的错误:不允许从闪亮输出对象读取。”

时间:2019-11-04 10:11:42

标签: r shiny

我正在制作一个闪亮的应用程序,在该应用程序中,用户可以根据制作的标签数量生成显示不同数据框的标签。例如,在下面的代码中:

library(shiny)
library(shinythemes)
library(DT)

ui <- navbarPage(theme = shinytheme("flatly"), 
                 title = "",
                 id = "tabs",
                 position = "static-top",
                 tabPanel(title = "Plus",
                          icon = icon("plus"))
)


server <- function(input, output, session) {

  count <- reactiveValues(value = 0)

  observeEvent(input$tabs, {
    if (input$tabs == "Plus"){
      count$value <- count$value + 1
      id = paste0("Base ", count$value)
      insertTab(inputId = "tabs",
                tabPanel(title = id,
                         fluidRow(
                           column(width = 12,
                                  dataTableOutput(outputId = paste0("data", count$value))
                           )
                         )), target = "Plus", 
                position = "before",
                select = TRUE)}
  })


    output$data1 <- renderDataTable({
      mtcars[1, 1:2]
    })


    output$data2 <- renderDataTable({
      mtcars[2, 1:2]
    })


    output$data3 <- renderDataTable({
      mtcars[3, 1:2]
    })

}

shinyApp(ui = ui, server = server)

您会看到用户可以添加一个选项卡,并且选项卡1将生成数据框的第一行,选项卡2将生成数据框的第二行,等等。

但是,此方法有一个局限性:我必须为用户可能显示的所有行编写代码。为了减少代码的长度,同时又不将用户限制为一定的行数,我想实现这一点的自动化。

我想创建一个在每个选项卡中显示右行的函数。因此,我创建了一个函数,该函数根据给定的参数创建了一个不同的数据框,并将此函数包含在observeEvent中,以便单击“加号”将创建一个新的选项卡,并用正确的数据框填充它。

下面是新代码(ui部分是相同的):

server <- function(input, output, session) {

  treat <- function(i){
    output$paste0("data", i) <- renderDataTable({
      mtcars[i, 1:2]
    })
  }

  count <- reactiveValues(value = 1)

  observeEvent(input$tabs, {
    if (input$tabs == "Plus"){
      count$value <- count$value + 1
      id = paste0("Base ", count$value)
      insertTab(inputId = "tabs",
                tabPanel(title = id,
                         fluidRow(
                           column(width = 12,
                                  dataTableOutput(outputId = paste0("data", count$value))
                           )
                         )), target = "Plus", 
                position = "before",
                select = TRUE)

      treat(count$value)
      }
  })

问题是我收到此错误:

  

<-中的错误:分配目标扩展为非语言对象

在搜索解决方案时,我发现需要使用assign函数。所以我将功能更改为:

  treat <- function(i){
    assign(output$paste0("data", i), renderDataTable({
      mtcars[i, 1:2]
    })
    )
  }

但是由于我现在在函数中使用了闪亮的输出,所以出现了错误:

  

$。shinyoutput中的错误:不允许从Shinyoutput对象读取。

我如何绕过此错误以获得我想要的东西?

1 个答案:

答案 0 :(得分:0)

找到了解决方案:我只需要将output$paste0("data", i)替换为output[[paste0("data", i)]]

希望这对某人有帮助