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