mydata, который вы определяете в реактиве mydatatable
, больше нигде не виден. Чтобы понять почему, я предлагаю вам прочитать о пространствах имен и средах R;один хороший урок по этому вопросу - Advanced R - Environments * Hadley .
Чтобы исправить это, я предлагаю вам сделать сами данные реактивным блоком и зависеть от него в двух других ваших блоках (таблица и график):
server <- function(input, output) {
mydata <- reactive({
req(input$data1s, input$data2s)
data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s)))
})
#show the data
output$mydatatable <- renderTable({ req(mydata()); })
#show the histogram
output$distPlot <- renderPlot({
req(mydata())
ggplot(mydata(), aes(x=our_data)) +
geom_histogram(bins = input$bins)
})
}
(не проверено.)
Я добавил использование req
исключительно для предотвращения дрожания при запуске и предупреждений / ошибок в приложении. Когда блестящее приложение прогревается, обычно входные переменные пусты (NULL
), и все, что от него зависит, будет временно вызывать ошибки до тех пор, пока входные данные не стабилизируются. (Для примера того, почему что-то спотыкается, input$data1s
может сначала показать значение NULL
и попытаться посмотреть, сработает ли data.frame(our_data=rep(1,NULL))
.)
req
просто ищет что-то, что "истина ", что означает: не NULL
, не NA
, не FALSE
, длина больше 0 и т. д. Подробнее см. ?shiny::req
.
Хотя req
строго не требуется,у него есть свои преимущества. Как вы можете сделать из кода таблицы, req(x)
вернет "первое значение, которое было передано в" (из ?req
), поэтому для краткости его можно использовать в этом режиме быстрого доступа.
И еще одна мыльница: в моем ограниченном опыте с shiny
реактивностью я несколько раз генерировал данные в реактивном блоке и использовал их исключительно в этом реактивном блоке. Учитывая, что всякий раз, когда вы создаете data.frame
(или list
или ... какую-то важную структуру, зависящую от пользовательского ввода), часто выгодно делать ее собственным реактивным компонентом (в частности, не компонентом output
). ), а затем зависите от него столько раз, сколько необходимо.