我正在制作一个闪亮的应用程序,在该应用程序中,用户可以根据制作的标签数量生成显示不同数据框的标签。例如,在下面的代码中:
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,session) {
treat <- function(i){
output$paste0("data",i) <- renderDataTable({
mtcars[i,1:2]
})
}
count <- reactiveValues(value = 1)
observeEvent(input$tabs,select = TRUE)
treat(count$value)
}
})
问题是我收到此错误:
在搜索解决方案时,我发现需要使用assign
函数。所以我将功能更改为:
treat <- function(i){
assign(output$paste0("data",i),renderDataTable({
mtcars[i,1:2]
})
)
}
但是由于我现在在函数中使用了闪亮的输出,所以出现了错误:
$。shinyoutput中的错误:不允许从Shinyoutput对象读取。
我如何绕过此错误以获得我想要的东西?