我有一个包含有精美应用程序的软件包。我想在应用程序中包含一个链接以打开小插图。我宁愿让该链接直接打开用户的小插图版本(即...我宁愿不必在某处在线维护小插图的副本)。我不确定程序包是否会进入CRAN,所以我也不想依赖CRAN链接(而且闪亮的应用程序只会在本地运行)。我已经尝试过这是ui代码:
vig_path <- system.file("doc", package="myPackage")
HTML(paste0("<a href=\"file:///", vig_path,"/Introduction.html\">Introduction</a>"))
当复制链接位置并将其粘贴到浏览器中时(即通过Chrome开发工具从“检查”中),它会打开(因此,路径正确)。没有错误“不允许加载本地资源:”。那么,我是不是很幸运,还是有一个技巧可以打开我丢失的本地文件?
答案 0 :(得分:2)
好吧,大多数在R中显示小插曲的魔术都发生在utils:::print.vignette
函数中。该功能可以使用R的内置帮助系统获取帮助页面的URL。不幸的是,从函数本身提取URL似乎并不容易。但是我们可以消除胆量,然后自己包裹起来。例如
get_vignette_link <- function(...) {
x <- vignette(...)
if (nzchar(out <- x$PDF)) {
ext <- tools::file_ext(out)
port <- if (tolower(ext) == "html")
tools::startDynamicHelp(NA)
else 0L
if (port > 0L) {
out <- sprintf("http://127.0.0.1:%d/library/%s/doc/%s",
port, basename(x$Dir), out)
return(out)
}
}
stop("no html help found")
}
我们可以像使用它
get_vignette_link("programming", package="dplyr")
,并且应该返回该小插图的URL。它使用与?vignette
函数相同的参数。然后,您可以使用它在Shiny应用程序中创建链接。例如
library(shiny)
ui <- fluidPage(
htmlOutput("text")
)
server <- function(input, output) {
output$text <- renderUI({
a("dplyr programming vignette",
href=get_vignette_link("programming", package="dplyr"))
})
}
shinyApp(ui = ui, server = server)
因为要通过R的HTML帮助服务器,所以不必访问本地文件路径,因此不会出现权限错误。