Ant*_*ine 6 r font-awesome shiny shinyapps
我正在通过该icon功能在整个 Shiny 应用程序中使用 fontawesome 图标。
我已经下载了 fontawesome 的专业版,并使用了这里的说明:shinydashboard some Font Awesome Icons Not Workingshiny\www\shared\font-awesome用我的付费版本替换 Shiny 默认使用的免费版本(内部)。这在本地工作得很好,所有专业图标都显示在我的应用程序中。
但是,当我部署到 时shinyapps.io,Shiny 似乎又回到了使用默认版本。我确实尝试将我的 pro 目录包含在/www/我的应用程序文件夹中,但没有成功。似乎没有办法告诉icon()函数查看 fontawesome 的本地版本,例如icon(...,lib=local), 或icon(...,lib=path_to_fa)...
任何帮助将非常受欢迎。
最简单、最可靠的方法是:
将 font-awesome 文件放在应用程序的子目录中,www/fontawesome/
将以下内容添加到 UI 代码中:
htmlDependency(
name = "font-awesome", version = "99.0",
src = "./www/fontawesome",
stylesheet = "css/all.min.css"
)
Run Code Online (Sandbox Code Playgroud)
这是一个示例应用程序,说明了:
shinyApp(
ui = fluidPage(
"This is a Font-Awesome Pro-only icon: ", icon("acorn"),
htmlDependency(
name = "font-awesome", version = "99.0",
src = "./www/fontawesome", stylesheet = "css/all.min.css"
)
),
function(input, output, session) { }
)
Run Code Online (Sandbox Code Playgroud)
另一种方法的一个潜在问题是,如果ui组件包含对 的调用icon(),然后有一些动态渲染的 UI(通过renderUI()和uiOutput()),其中包含对my_icon()使用仅在 Font-Awesome Pro 中的图标的调用,则该 Pro图标将不会显示。我这里展示的方法不会有这个问题。
这就是为什么其他方法会出现这个问题:当应用程序的静态ui呈现为 HTML 时,它会htmlDependency在 中查找对象,并且给定名称(在本例中为“font-awesome”)ui的最新版本“获胜” htmlDependency”。icon()因此,如果代码中只有对 的调用(并且没有对 的调用my_icon(),或者在我的示例中显式调用htmlDependency()),那么胜出的 Font-Awesome 的 htmlDependency 就是在撰写本文时 Shiny 5.13.0 附带的 htmlDependency。浏览器将请求该版本的 Font-Awesome。
稍后,如果renderUI()插入my_icon()带有 Pro 图标的 ,则 HTML 将与 Font-Awesome Pro 的对象一起发送到浏览器htmlDependency。然而,此时浏览器已经加载了 Font-Awesome,并且它不会知道加载它的较新版本 - Shiny 目前无法用较新的版本替换已加载的 Font-Awesome 版本。
将自定义添加htmlDependency到静态ui对象可以使其在初始页面渲染时得到解析,并且浏览器知道从一开始就加载较新的版本。我使用的版本99.0确保此自定义版本将“胜过”任何其他版本的 Font-Awesome htmlDependency。
诀窍是,在htmlDependency调用内部(在icon()函数中),删除package = "shiny"并替换"www/shared/fontawesome"为我的 FA 文件夹的绝对路径(我还更新了版本号)。
编辑:更准确地说,下面是(非常轻微地)修改的图标功能:
my_icon = function (name, class = NULL, lib = "font-awesome") {
prefixes <- list(`font-awesome` = "fa", glyphicon = "glyphicon")
prefix <- prefixes[[lib]]
if (is.null(prefix)) {
stop("Unknown font library '", lib, "' specified. Must be one of ",
paste0("\"", names(prefixes), "\"", collapse = ", "))
}
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)
if (lib == "font-awesome") {
htmlDependencies(iconTag) <- htmlDependency("font-awesome",
"5.7.2", "./www/shared/fontawesome/",
stylesheet = c("css/all.min.css"))
}
htmltools::browsable(iconTag)
}
Run Code Online (Sandbox Code Playgroud)
除了注释掉一些行之外,我唯一改变的部分是htmlDependency调用。在原始函数中,它是:
htmlDependency("font-awesome", "5.3.1", "www/shared/fontawesome", package = "shiny",
stylesheet = c("css/all.min.css", "css/v4-shims.min.css")
Run Code Online (Sandbox Code Playgroud)