1

我试图分离我的 Shiny 应用程序的功能以使其可重用。

我有我的用户界面。我定义的R文件:

tabPanel("Unemployed", source("unemployed_select.R", local=TRUE)$value),

在我的unused_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 库https://shiny.rstudio.com/gallery/basic-datatable.html中一个著名示例的代码

只是为了确保没有数据问题。仍然数据表没有呈现,所以我想它必须是在源文件 unused_select.R 内部定义的问题

有任何想法吗?

问候

4

1 回答 1

1

你是对的,你需要使用它source()来加载你的模块文件,但是对于 Shiny,你需要知道namespaces。模块和它所在的文件必须共享一个命名空间,其中事物的名称是共享的。例如,在您的模块代码中,您有以下行:

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文件中调用该函数,并且必须将所有内容包装在 atagList而不是 a 中fluidPage

祝你好运!

于 2017-01-07T05:51:59.630 回答