【问题标题】:Modularizing Shiny R app code模块化 Shiny R 应用程序代码
【发布时间】:2017-05-21 02:56:14
【问题描述】:

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

我有我的 ui。我定义的 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 的问题。

有什么想法吗?

问候

【问题讨论】:

  • Do ỳou source make_df.R in server.R?
  • Yes Roman 使用 source("make_df.R")。我什至尝试在服务器文件夹中创建单独的脚本,试图遵循 showmeshiny 中的示例但没有成功

标签: r dataframe module shiny reactive


【解决方案1】:

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

column(4,
   selectInput("man",
               "Manufacturer:",
               c("All",
                 unique(as.character(mpg$manufacturer))))

但是您希望模块共享包含它的文件的命名空间,因此您需要有一种方法让包含模块的文件知道哪些部分是 id,例如“man”,哪些部分是 id零件是严肃的论点,例如“制造商:”

所以在一个闪亮的模块中,那一行会变成

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

祝你好运!

【讨论】:

  • 谢谢法尔汉。很有用
猜你喜欢
  • 2021-05-21
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2015-04-12
  • 2023-01-22
相关资源
最近更新 更多