2.11 Web 页面和 Shiny 应用
与 HTML 小组件类似,书籍中可以嵌入任意网页。你可以使用函数 knitr::include_url()
通过 URL 在书籍中包含该网页。当输出格式为 HTML 时,它会使用一个 iframe
;8在其他情况下,knitr 尝试拍摄该网页的屏幕截图(或使用你提供的自定义屏幕截图)。所有区块选项都与 HTML 小组件的选项相同。一个可能需要你特别注意的选项是 delay
:HTML 小组件是在本地渲染的,因此 PhantomJS 通常可以快速加载以获取屏幕截图,但是加载任意 URL 可能需要更长的时间,因此你可能需要使用更大的 delay
值,例如,使用区块选项 screenshot.opts = list(delay = 5)
。
另一个相关的函数是 knitr::include_app()
,它与 include_url()
非常相似。它是为通过 URLs 在输出中嵌入 Shiny 应用程序而设计的。它与 include_url()
的唯一区别在于,如果 URL 中不存在其他查询参数,它会自动将查询参数 ?showcase=0
添加到 URL 中,以禁用 Shiny 的 showcase 模式,该模式对于屏幕截图或 iframes 来说不太可能有用。如果确实需要 showcase 模式,请使用 include_url()
而不是 include_app()
。下面是一个 Shiny 的应用程序示例(图 2.6):
图 2.6: 通过 miniUI 软件包创建的一个 Shiny 应用;你可以在 https://yihui.shinyapps.io/miniUI/ 看到在线版本
同样的,如果你正在阅读本书的 HTML 版本,将看到一个活动的应用程序,如果你正在阅读本书的其他格式版本,将看到一个静态屏幕截图。上面的 Shiny 应用程序是使用 miniUI 软件包 (R-miniUI?) 创建的,这个软件包提供的布局功能对于小屏幕上的 Shiny 应用程序特别好。如果使用普通的 Shiny 布局功能,则可能会在 iframe 中看到垂直和/或水平滚动条,因为页面大小太大,无法放入 iframe 中。如果 iframe 的默认宽度太小,可以使用区块选项 out.width
进行更改。对于 iframe 的高度,请使用 include_url()
/include_app()
的 height
参数。
Shiny 应用程序可能需要比普通 URL 更长的加载时间。你可能需要对 delay
选项使用一个保守的值,例如 10。不用多加叙说,include_url()
和 include_app()
需要一个正常工作的 Internet 连接,除非你以前缓存了区块(但是如果没有 Internet 连接,iframe 内的网页仍然无法工作)。
iframe
基本上是一个网页上的框,用于嵌入另一个网页。↩︎