我正在制作一个闪亮的应用程序,在该应用程序中,用户可以根据制作的标签数量生成显示不同数据框的标签。例如,在下面的代码中:
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对象读取。
我如何绕过此错误以获得我想要的东西?
答案 0 :(得分:0)
找到了解决方案:我只需要将output$paste0("data", i)
替换为output[[paste0("data", i)]]
。
希望这对某人有帮助