4

ある実行中のインスタンスから実行中の他のインスタンスに情報を渡すことができる R Shiny アプリを構築したいと考えています。これまでのところ、これに役立つものは何も見つかりませんでした。グローバル変数に頼ったり、ファイルに書き込んだりするのではなく、正しく実行したいと考えています(以下の例ではグローバル変数を使用しましたが、これは悪い習慣; ファイルへの書き込みも良い習慣ではないと思います)。

たとえば、サーバー上で App.R を実行していて、TimJack、およびJohnがそれを開いているとします。ジャックジョンも同時にアプリを使用しているときに、次の例に示すようにボタンを押して、ティムに以下を表示させるにはどうすればよいですか?

App.R:

library(shiny)

# Somehow interactively visible variable? (I know global variables are bad, I wouldn't want to use such)
txt <<- ""

shinyApp(
    ui = fluidPage(
        textInput("name", "User name", value="USERNAME"),
        actionButton("button", "Button"),
        htmlOutput("text")
    ),
    server = function(input, output, session){
        a <- eventReactive(input$button, {
            txt <<- paste(txt, "Button pressed by", input$name, "at", Sys.time(), "<br>")
            txt

        })
        output$text <- reactive({
            HTML(a())
        })
    }
)

ブラウザでアプリ インスタンスを実行しているそれぞれのユーザーから複数のボタンを押した後の望ましい出力の例 (すべて一意の input$name が選択されていますが、明らかに一意のセッション ID の方が優れています)。

ユーザーケースの例

どんな洞察も大歓迎です、ありがとう!

4

1 に答える 1

5

光沢のあるサーバー インスタンスでコードをテストしたところ、期待どおりに動作しました。つまり、要求されたものと同様の出力が得られました。

私は少し混乱しています re: あなたは正確に何を探していますか?

とにかく、一般的なコメントとして、使用<<-が間違っている、またはglobal variables(一般的にまたは光沢のあるアプリで)悪いことに同意しません。

それらにはそれぞれの場所があり、実際に典型的なユースケースは、セッション/ユーザー間で状態を渡すことです。

別の方法は、次のように使用することshiny reactiveValuesです。

 values <- reactiveValues()
 values$lognames <- ''
 ...
 ui <- (...)

 server <- function(input, output, session){

 a <- eventReactive(input$button, {
 values$lognames <- paste(values$lognames, "Button pressed by", input$name, "at", Sys.time(), "<br>")
 values$lognames
 })
...
 }

ただし、一般的な注意点として、このタイプの設計は可能ではありますが、最終的にアプリにステートフルreactive性をもたらし、その複雑さを急速に高め、パラダイムの単純さに逆らう可能性があります。

この道を歩む前に、すべてのステップを慎重に検討することを強くお勧めします。私は、こうしたstates. もろくてデバッグが難しいアプリにつながるすべての状態の変化を追跡する必要がありました。

于 2016-12-26T05:28:57.357 に答える