此信息直接通过 Shiny 的isRunning
功能提供。
以下过时的答案:
您可以执行以下操作:
shiny_running = function () {
# Look for `runApp` call somewhere in the call stack.
frames = sys.frames()
calls = lapply(sys.calls(), `[[`, 1)
call_name = function (call)
if (is.function(call)) '<closure>' else deparse(call)
call_names = vapply(calls, call_name, character(1))
target_call = grep('^runApp$', call_names)
if (length(target_call) == 0)
return(FALSE)
# Found a function called `runApp`, verify that it’s Shiny’s.
target_frame = frames[[target_call]]
namespace_frame = parent.env(target_frame)
isNamespace(namespace_frame) && environmentName(namespace_frame) == 'shiny'
}
现在您可以简单地shiny_running()
在代码中使用并返回一个逻辑值,该值指示文档是否作为 Shiny 应用程序运行。
根据Shiny the mailing list 上的讨论,这可能是(接近)最好的方式 ——但请注意讨论中提到的警告。
改编自“模块”包中的代码。
或者,以下工作。它可能更适合 Shiny/RMarkdown 用例,但需要存在 YAML 前端:它通过从中读取runtime
值来工作。
shiny_running = function ()
identical(rmarkdown::metadata$runtime, 'shiny')