#css #r #shiny #r-markdown
#css #r #блестящий #r-markdown
Вопрос:
Есть ли лучший способ для программистов в группе, желающих использовать общий стиль для shiny apps или rmarkdown docs, получить доступ к файлу css из одного места, а не вручную копировать нужный файл в субконтенты каждого приложения или документа?
Идеальным результатом было бы поместить файл (ы) в репозиторий github, а затем прикрепить его к любому блестящему приложению или файлу rmarkdown с его веб-ссылкой, возможно ли это?
Спасибо.
Ответ №1:
Возможно, было бы проще включить ваши таблицы стилей в пакет R. Это избавило бы от необходимости внешнего запроса при каждой загрузке вашего приложения или открытии документа. Поместите ваши файлы css в папку в inst
и напишите единственную функцию R, которая задает пути ресурсов к вашему css и загружает файлы соответствующим образом.
Допустим, ваш пакет имеет следующую структуру. (Для этого примера я даю имя пакету mypkg
)
mypkg/
R/
use_stylesheets.R
inst/
stylesheets/
styles.min.css
...
...
В use_stylesheets.R
создайте функцию, которая загружает таблицы стилей в заголовок документа ( tags$head
) с помощью tags$link
.
use_stylesheets <- function() {
shiny::addResourcePath(
"styles",
system.file("stylesheets", package = "mypkg")
)
shiny::tags$head(
shiny::tags$link(rel = "stylesheet", href = "styles.min.css")
)
}
Затем в вашем приложении или документе Rmarkdown вы можете загрузить файлы в свое приложение с помощью: mypkg::use_stylesheets()
Ответ №2:
После некоторой переделки я смог добиться успеха (ожидая, пока коллеги протестируют на своих машинах), используя эти структуры для добавления css или html из пакета как в блестящие приложения, так и в документы Rmarkdown.
# For attaching a css file to an Rmarkdown file
use_package_style_rmd <- function(css_file = "my_css.css"){
# css file
file_name <- paste0("/", css_file)
file_path <- paste0(system.file("stylesheets", package = "my_pkg"), file_name)
shiny::includeCSS(path = file_path)
}
# For placing an HTML headers/footers in place
use_package_header <- function(html_file = "my_header.html"){
# HTML Header
file_name <- paste0("/", html_file)
file_path <- paste0(system.file("stylesheets", package = "my_pkg"), file_name)
shiny::includeHTML(path = file_path)
}
# For attaching css to a shiny app via resourcePath
use_package_style_shiny <- function(stylesheet = "my_css.css"){
# Add Resource Path
shiny::addResourcePath(
prefix = "styles",
directoryPath = system.file("stylesheets", package = "my_pkg"))
# Link to App
shiny::tags$head(
shiny::tags$link(rel = "stylesheet",
href = paste0("styles/", stylesheet)))
}
use_package_style_rmd
Функция может быть помещена в любой фрагмент кода, в то время как функция заголовка добавит html на место, где выполняется функция.
В случае использования приложения Shiny следует запустить функцию для определения пути ресурса к папке, затем в пользовательском интерфейсе под fluidpage
параметром темы можно установить файл css, используя префикс для пути к ресурсу styles/my_css.css
.
Одна из проблем, с которой я все еще сталкиваюсь, которая может быть отдельным вопросом, заключается в том, где разместить вспомогательный файл изображения и как добавить относительный путь, чтобы изображение можно было поместить в верхний или нижний колонтитул.