繁体   English   中英

R Shiny:如何使用带有图标功能的 fontawesome pro 版?

[英]R Shiny: how to use fontawesome pro version with the icon function?

我通过icon功能在整个 Shiny 应用程序中使用 fontawesome 图标。

我已经下载了 fontawesome 的专业版,并使用了这里的说明: shinydashboard some Font Awesome Icons Not Working用我的付费版本替换 Shiny 默认使用的免费版本(在 Shiny shiny\\www\\shared\\font-awesome ) . 这在本地工作得很好,所有专业图标都显示在我的应用程序中。

但是,当我部署到shinyapps.io ,Shiny 似乎又回到了使用默认版本。 我确实尝试将我的 pro 目录包含在我的应用程序的/www/文件夹中,但没有成功。 似乎没有办法告诉icon()函数查看 fontawesome 的本地版本,例如icon(...,lib=local)icon(...,lib=path_to_fa) ...

任何帮助将非常受欢迎。

诀窍是,在htmlDependency调用中(在icon()函数中),删除package = "shiny"并用我的 FA 文件夹的绝对路径替换"www/shared/fontawesome" (我还更新了版本号)。

编辑:更准确地说,下面是(非常轻微地)修改的图标功能:

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)
}

除了注释掉一些行之外,我唯一改变的部分是htmlDependency调用。 在原始函数中,它是:

htmlDependency("font-awesome", "5.3.1", "www/shared/fontawesome", package = "shiny",
               stylesheet = c("css/all.min.css", "css/v4-shims.min.css")

最简单和最可靠的方法是:

  1. 将 font-awesome 文件放在应用程序的子目录中, www/fontawesome/

  2. 在 UI 代码的某处添加以下内容:

     htmlDependency( name = "font-awesome", version = "99.0", src = "./www/fontawesome", stylesheet = "css/all.min.css" )

这是一个示例应用程序,说明:

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) { }
)

另一种方法的一个潜在问题是,如果ui组件包含对icon()的调用,然后有一些动态渲染的 UI(通过renderUI()uiOutput() )包含对my_icon()的调用,该调用使用一个仅在 Font-Awesome Pro 中的图标,那么该 Pro 图标将不会显示。 我在这里展示的方法不会有这个问题。

这就是为什么其他方法会出现这个问题的原因:当应用程序的静态ui呈现为 HTML 时,它会在ui查找htmlDependency对象,以及给定名称的htmlDependency的最新版本(在本例中为“font-awesome ") "获胜"。 因此,如果代码中只调用了icon() (并且没有调用my_icon() ,或者在我的示例中没有调用显式htmlDependency() ),那么获胜的 Font-Awesome 的 htmlDependency 就是 Shiny 附带的那个,在撰写本文时为 5.13.0。 浏览器将请求该版本的 Font-Awesome。

稍后,如果renderUI()插入带有 Pro 图标的my_icon() ,则 HTML 将与 Font-Awesome Pro 的htmlDependency对象一起发送到浏览器。 然而,此时浏览器已经加载了 Font-Awesome,它不会知道加载它的这个新版本——Shiny 目前无法用更新的版本替换已经加载的 Font-Awesome 版本。

将自定义htmlDependency添加到静态ui对象使其可以在初始页面呈现时解析,并且浏览器知道从一开始就加载较新的版本。 我使用的版本99.0确保此自定义版本将“胜过” Font-Awesome htmlDependency任何其他版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM