我尝试在 for 循环内的闪亮仪表板中启动数据框。 我的目的是在每次迭代中更新数据框中的值,并在闪亮的仪表板中显示它。 由于某种原因,闪亮的仪表板根本没有启动。 尽管如果我选择
shinyApp(ui, server)
行并按 Enter,仪表板会正确启动。
仪表板未在循环内启动的原因可能是什么?非常感谢!
library(shiny)
library(shinydashboard)
library(DT)
# my dataframe:
letter <- c("a","b")
number <- c(1,2)
df <- data.frame(letter, number)
# sidebar
sidebar <- dashboardSidebar()
# body
body <- dashboardBody(
fluidRow(
box(width = 6,
DT::dataTableOutput("mytable")
)
)
)
# ui
ui <- dashboardPage(dashboardHeader(title = "hello world"),
sidebar,
body
)
# server logic
server <- function(input, output) {
output$mytable = DT::renderDataTable({
df
})
}
#launch shiny app:
for (t in 1:3) {
df[1,2] <- t
shinyApp(ui, server)
}
编辑1
我已经尝试用下面的代码替换服务器代码,尽管这不会在 Shiny 中提供数据框:
# server logic
server <- function(input, output) {
# my dataframe:
df <- reactive(
for (t in 1:300) {
data.frame(
letter=c("a","b"),
number=c(1,t)
)}
)
output$mytable <- DT::renderDataTable({
df()
})
}
按照您在示例中描述的方式使用 for 循环是行不通的,因为 for 循环会产生多个闪亮的应用程序,但我假设您想要的只是简单地更新您的闪亮应用程序。在这种特定情况下,数据框的值位于 [1,2] 处。使用简单的计数器比使用循环更容易实现。
# sidebar
sidebar <- dashboardSidebar()
# body
body <- dashboardBody(
fluidRow(
box(width = 6,
inputPanel(numericInput("NUM","iteration",value=1)),
DT::dataTableOutput("mytable")
)
)
)
# ui
ui <- dashboardPage(dashboardHeader(title = "hello world"),
sidebar,
body
)
# server logic
server <- function(input, output) {
# my dataframe:
df <- reactive(
data.frame(
letter=c("a","b"),
number=c(1,input$NUM)
))
output$mytable <- DT::renderDataTable({
df()
})
}
shinyApp(ui, server)
查看 df 是如何创建为反应对象的,因此您可以像调用函数一样调用它:
df()
而不是渲染函数中的df
。
df[1,2] 被简单地分配给
input$NUM
,即在 UI 中设置的计数器。
我希望这有助于并回答您的问题,如果没有,请随时更新您的问题或发表评论。