我正在尝试将我的Shiny应用程序的功能分开,以使其可重用。
我有 ui。 R 文件我定义的地方:
tabPanel("Unemployed", source("unemployed_select.R", local=TRUE)$value),
并在我的 unemployed_select.R 中定义:
fluidPage(
titlePanel("Basic DataTable"),
# Create a new Row in the UI for selectInputs
fluidRow(
column(4,
selectInput("man",
"Manufacturer:",
c("All",
unique(as.character(mpg$manufacturer))))
),
column(4,
selectInput("trans",
"Transmission:",
c("All",
unique(as.character(mpg$trans))))
),
column(4,
selectInput("cyl",
"Cylinders:",
c("All",
unique(as.character(mpg$cyl))))
)
),
# Create a new row for the table.
fluidRow(
DT::dataTableOutput("table")
)
)
我的 server.R 文件是:
library(shiny)
library(shinythemes)
library(dataset)
shinyServer(function(input, output) {
# Filter data based on selections
output$table <- DT::renderDataTable(DT::datatable({
data <- mpg
if (input$man != "All") {
data <- data[data$manufacturer == input$man,]
}
if (input$cyl != "All") {
data <- data[data$cyl == input$cyl,]
}
if (input$trans != "All") {
data <- data[data$trans == input$trans,]
}
data
}))
})
我使用了R gallery https://shiny.rstudio.com/gallery/basic-datatable.html
中众所周知的示例中的代码只是为了确保没有数据问题。仍然没有数据表渲染,所以我想它必须是定义内部源文件 unemployed_select.R 的问题。
有什么想法吗?
此致
答案 0 :(得分:1)
您是正确的,您需要使用source()
来加载您的模块文件,但是使用Shiny,您需要了解名称空间。源自其的模块和文件必须共享命名空间,其中事物的名称是共享的。例如,在您的模块代码中,您有以下这一行:
column(4,
selectInput("man",
"Manufacturer:",
c("All",
unique(as.character(mpg$manufacturer))))
但是你希望模块共享它所包含的文件的命名空间,所以你需要有办法让文件(包括模块)知道哪些部分是id,比如“man”和哪个零件是严重的论据,如“制造商:”
所以在一个闪亮的模块中,那条线将成为
column(4,
selectInput(ns("man"),
"Manufacturer:",
c("All",
unique(as.character(mpg$manufacturer))))
此处ns()
函数用于在命名空间中包含id,这将允许您声明的id“man”可供应用程序的其余部分使用。
在Shiny中有一个很好的命名空间和编写模块指南:
https://shiny.rstudio.com/articles/modules.html
上面的链接指出你必须命名空间id,必须使你的模块适合函数并使用callModule()
文件中的ui.R
调用该函数,并且必须将所有内容包装在{{1而不是tagList
。
祝你好运!