7

Rnw ファイルとインタラクティブな光沢のある R マークダウン ドキュメントの 2 つの場所で R コードを実行したいと考えています。

したがって、インタラクティブな光沢のあるコンポーネントは Rnw ファイルでは機能しないため、インタラクティブなコードをロードするかどうかを検出する R のコード スニペットが必要です。

これは機能しているように見えますが、簡単なハックのように感じます:

if (exists("input")) { # input is provided by shiny
    # interactive components like renderPlot for shiny
} else {
    # non-interactive code for Rnw file
}

安定したソリューション、またはアクセスできるグローバル変数のようなものはありますか? shinyまたは、パッケージがロードされているかどうかを確認する必要がありますか?

最も安全なものは何ですか?

4

3 に答える 3

3

isRunningこの情報は、Shiny の関数を介して直接提供されます。


以下の古い回答:

次のことができます。

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 での議論によると、これはおそらく (それに近い) 最善の方法ですが、 議論で言及されている注意事項に注意してください。

「モジュール」パッケージのコードから適応。

または、次のように動作します。Shiny/RMarkdown ユースケースにより適している可能性がありますが、YAML フロント マターの存在が必要です。それは、runtimeそこから値を読み取ることによって機能します。

shiny_running = function ()
    identical(rmarkdown::metadata$runtime, 'shiny')
于 2015-09-28T16:47:25.980 に答える
2

更新: Konrad Rudolphs のコメントの後、私は自分のアプローチを再考しました。私の元の答えは以下にあります。

私のアプローチは、Konrad Rudolphs とは異なり、OP の最初の考えとも異なる可能性があります。コードはそれ自体を物語っています:

if (identical(rmarkdown::metadata$runtime, "shiny")) {
  "shinyApp" 
} else {
  "static part"
}

このコードをアプリ内から実行するのではなく、アプリのラッパーとして使用します。コードが YAML フロント マターの.Rmdwith内にあるruntime: shiny場合はアプリを起動し、そうでない場合は静的部分を表示します。

それはあなたが望んでいたことをし、可能な限り安定していると思います。


私の最初の考えは、インタラクティブなドキュメントにいるかどうかに関係なく、ハードコードすることでした。

document_is_interactive <- TRUE

if (document_is_interactive) {
    # interactive components like renderPlot for shiny
} else {
    # non-interactive code for Rnw file
}

可能ではありますが、これは問題を引き起こす可能性があるため、 を使用した他のアプローチよりも安定性が低くなりますrmarkdown::metadata$runtime

于 2015-09-27T21:30:57.360 に答える