- 下载 fontawesome 4.7.1 并解压
- 在 global.R 中插入下面的代码
- 更新解压后的 fontawesome 的路径
....然后shiny可以做到fontawesome 4.7.1和+5。这个特定的解决方案复制为猪排推荐 https://stackoverflow.com/questions/32686195/shinydashboard-some-font-awesome-icons-not-working/32689957#32689957安装的闪亮库中旧版本的font-awesome。我还更新了 icon() 函数,以便可以让很棒的版本共存并确保正确的链接。在此解决方案中,新的 icon() 函数被放置在 globalEnv 中,因此位于 search() 路径的顶部。这在不改变任何其他内容的情况下解决了我的代码库遗留问题。
然而,为了制作一个新的闪亮应用程序,我将命名图标函数 icon_legacy() 以避免依赖 search() 路径或在闪亮应用程序的支持 R 包中实现。
##install new shiny version
install.packages("shiny") #install newest shiny
library(shiny)
library(htmltools)
#source in this function to globalEnv
#' Legacy means good old iconic times
#'
#' @param local_path_fa_4.7.1
#' @param shiny_path
#'
#' @return
#' @export
#' @import shiny htmltools
#' @details #this installs legacy font-awesome and return a function similar to icon
#'
#' @examples
#'
#' install.packages("shiny") #install newest shiny
#' library(shiny)
#' library(htmltools)
#' my_fa_path = "./misc/global_source/fa_shiny_4.7.1/font-awesome"
#' icon_legacy = activate_icon_legacy(my_fa_path) #tadaaa use icon_legacy now
#' #btw css pseudo-elements seem to work out-of-the-box also
#'
#' icon = icon_legacy #you may also feel like placing icon in global env to override shiny::icon
activate_icon_legacy = function(
local_path_fa_4.7.1,
shiny_path = system.file(package="shiny")
) {
#find out what version of shiny is installed
uses_fontawesome5 = packageVersion("shiny")>=1.2 #because implemented since 1.2
shiny_resource_path = paste0(shiny_path,"/www/shared")
misses_fontawesome4 = !"font-awesome" %in% list.files(shiny_resource_path) #because new fa dir is called 'fontawesome'
#if legacy dir is missing from library copy into installed library
if(uses_fontawesome5 && misses_fontawesome4) {
file.copy(
from = local_path_fa_4.7.1,
to = shiny_resource_path,
recursive = TRUE,copy.mode = FALSE
)
}
#import minor dependency from shiny library into closure
font_awesome_brands = shiny:::font_awesome_brands
tags = htmltools::tags
#source this modified icon() function from library/shiny/R/bootstrap.R
#notice the legacy feature if true will use old fa 4.7.1 else new
icon_legacy <- function(name, class = NULL, lib = "font-awesome",legacy=TRUE) {
prefixes <- list(
"font-awesome" = "fa",
"glyphicon" = "glyphicon"
)
prefix <- prefixes[[lib]]
# determine stylesheet
if (is.null(prefix)) {
stop("Unknown font library '", lib, "' specified. Must be one of ",
paste0('"', names(prefixes), '"', collapse = ", "))
}
# build the icon class (allow name to be null so that other functions
# e.g. buildTabset can pass an explicit class value)
iconClass <- ""
if (!is.null(name)) {
prefix_class <- prefix
if (prefix_class == "fa" && name %in% font_awesome_brands) {
prefix_class <- "fab"
}
iconClass <- paste0(prefix_class, " ", prefix, "-", name)
}
if (!is.null(class))
iconClass <- paste(iconClass, class)
iconTag <- tags$i(class = iconClass)
# font-awesome needs an additional dependency (glyphicon is in bootstrap)
if (lib == "font-awesome") {
if(legacy) {
htmlDependencies(iconTag) <- htmlDependency(
"fontwesome","4.7.1", "www/shared/font-awesome", package = "shiny",
stylesheet = c("css/font-awesome.css","font-awesome.min.css"))
} else {
htmlDependencies(iconTag) <- htmlDependency(
"font-awesome", "5.3.1", "www/shared/fontawesome", package = "shiny",
stylesheet = c("css/all.min.css","css/v4-shims.min.css")
)
}
}
htmltools::browsable(iconTag)
}
return(icon_legacy)
}
#download extract fontawesome 4.7.1 and write path here
my_fa_path = "./misc/global_source/fa_shiny_4.7.1/font-awesome"
icon_legacy = activate_icon_legacy(my_fa_path) #tadaaa use icon_legacy now
#btwcss pseudos seem to work out-of-the-box also
#one may also feel like placing icon_legacy() as icon() in globalEnv to override shiny::icon
#if youre too lazy change all your original code. This will work any code in ui.R and server.R
#however packages with explicit namespaces are likely not overridden by this.
icon = icon_legacy
#now shiny code will behave like this
icon("table",legacy=TRUE) # old style 9 cell table
icon("table",legacy=FALSE) # new fat 4 cell table
#...one may feel like opting for more explicit and strict namespace solution wrapped in some package.
#but that would be a lot more boiler plate code not relevant for this answer
#this solution also fixed my fontawesome CSS pseudo-elements issues