Spraw, aby obiekt utworzony wewnątrz jednego obiektu reaktywnego był dostępny dla innego w błyszczącym [duplikacie]

To pytanie ma już odpowiedź tutaj:

Ustaw globalny obiekt w Shiny 1 odpowiedź

Mam błyszczącą aplikację, w której definiuję obiekt na podstawie suwaków i tworzędata.frame z tego. To przyzwyczaja się do tworzenia fabuły, poniżej której chciałbym dołączyć tabelę podsumowań. Mój problem polega na tym, że wykres musi zostać zdefiniowany wewnątrz obiektu reaktywnego, aby można go było zaktualizować na podstawie suwaków, ale stwierdziłem, że kiedy próbowałem uzyskać dostęp do obiektu, aby wydrukować podsumowanie wróżn obiekt reaktywny, nie znaleziono.

Chciałbym nie uruchamiać dwukrotnie tego samego kodu obliczeniowego, aby wprowadzić obiekt do innego obiektu reaktywnego. Moje dwa początkowe pomysły:

Próbowałem użyćsave(object, file = "...") wewnątrz pierwszego obiektu reaktywnego, a następnie wstawienieload(file = "...") wewnątrz drugiego, ale nie aktualizuje się. Myślałem o zdefiniowaniu mojego obiektu poza moim reaktywnymplotOutput definicja, ale jestem prawie pewien, że nie zaktualizuje się, gdy dane wejściowe użytkownika zostaną zmienione; pozostanie tylko z wartością początkowąinput ustawienia domyślne obiektu.

Cóż, właśnie wypróbowałem ten drugi pomysł i nawet nie zaszło tak daleko:

Umieściłem to przedshinyServer(...) i nie może wygenerować danych, ponieważ moje połączenie zależy odinput i nie wie oinput w tym momencie Umieściłem poshinyServer(...) ale przedtemrenderPlot(...), aby stworzyć coś w rodzaju „globalnie dostępnego” obiektu dla wszystkich obiektów wyjściowych, a to mnie skarci za próbę zrobienia czegoś, co używainput poza funkcją reaktywną.

Oto przykład do zilustrowania, zmodyfikowany z Shiny's „Hello Shiny!” przykła:

ui.R

library(shiny)

# Define UI for application that plots random distributions 
shinyUI(pageWithSidebar(

  # Application title
  headerPanel("Hello Shiny!"),

  # Sidebar with a slider input for number of observations
  sidebarPanel(
    sliderInput("obs", 
                "Number of observations:", 
                min = 1,
                max = 1000, 
                value = 500)
  ),

  # Show a plot of the generated distribution
  mainPanel(
    plotOutput("distPlot"),
    tableOutput("summary")
  )
))

server.R

library(shiny)

# Define server logic required to generate and plot a random distribution
shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

    # generate an rnorm distribution and plot it
    dist <- rnorm(input$obs)
    hist(dist)
  })

  output$summary <- renderTable({
    #dist <- rnorm(input$obs)
    summary <- table(data.frame(cut(dist, 10)))
  })
})

Jeśli uruchomisz go tak, jak jest,cut rzuca i błąd, ponieważ nie wie odist. Jeśli odkomentujesz linię, w której ponownie zdefiniujemydist jak to zrobiono wplotOutput, to zadziała.

To jest prosty kod - mój jest nieco bardziej zaangażowany i naprawdę wolałbym nie uruchamiać go dwa razy, aby przekazać ten sam wynik innemu reaktywnemu wyjściu.

Propozycje

questionAnswers(1)

yourAnswerToTheQuestion