Использование числового значения c внутри реактивного контекста в блестящем приложении - PullRequest
0 голосов
/ 29 февраля 2020

Я только начал изучать блестящие приложения, так что, скорее всего, это очень простой c вопрос, но после поиска по форуму я так и не смог заставить его работать.

Как часть моего самого первого app У меня есть симулированная популяция ровно 100000 случаев, из которой я хотел бы выбрать n случайных выборок, используя для l oop. Таким образом, общий код будет выглядеть примерно так:

samples<-list(NULL)
for(i in 1:100){samples[[i]]<-dplyr::sample_n(population, size=200, replace=FALSE)}

Теперь я хочу включить ползунок, который заменяет 100 на для l oop, чтобы пользователь мог решить, сколько сэмплов нарисовать. Однако при определении ползунка в пользовательском интерфейсе и попытке выполнить следующие действия на стороне сервера

samples<-list(NULL)
for(i in 1:input$n_samples){samples[[i]]<-dplyr::sample_n(population, size=200, replace=FALSE)} 

я получаю следующую ошибку:

Ошибка в .getReactiveEnvironment () $ currentContext (): Операция не разрешена без активного реактивного контекста. (Вы пытались сделать что-то, что может быть сделано только внутри реактивного выражения или наблюдателя.)

Далее я попробовал

samples <- reactive({   
samples<-list(NULL)
for(i in 1:input$n_samples){samples[[i]]<-dplyr::sample_n(population, size=200, replace=FALSE)}     
})  

и версию с реактивом Val (), и реактивные значения () и все виды вариаций, но безуспешно.

В общем, все, что я хочу, это то, что значение, которое пользователь выбирает с помощью ползунка, определяет число повторений в моем для l oop.

Я также видел эту ветку, но не мог понять, является ли это аналогичной проблемой: Для l oop внутри реактивной функции в Shiny Надеюсь, кто-то может пролить немного света на этом.

1 Ответ

0 голосов
/ 01 марта 2020

Говорят, что растущие списки - плохая идея в R. Вы должны предварительно распределить свой список и заполнить пробелы итеративно. Следующее приложение сделает это.

В зависимости от совокупности (mtcars), изменение ползунка вызывает рисование столько образцов из 10 значений, сколько указано в ползунке. Результат можно прочитать, позвонив по номеру samples(). Каждый раз, когда изменяется ползунок, samples() обновляется (примечание: не samples, который является просто функцией, а samples(), который является результатом вызова функции, нарисованных образцов):

library(shiny)
library(dplyr)

population <- mtcars


ui <- fluidPage(h4("You have a population of", nrow(population), "values. Choose the number of random sample sets"),
                h5("(each sample contains 10 values):"),
                sliderInput("n", "Number of samples", min=1, max = 1000, value = 5),
                textOutput("summary"))


server <- function(input, output) {

    # a normal function that draws a sample of 10 values
    draw_single_sample <- function(x) sample_n(population, size = 10)

    # A reactive function that takes slider value and produce as many samples as the slider requests
    samples <- reactive(lapply(1:input$n, draw_single_sample))

    # Dependend on samples (thus input$n), print the result of the random draw
    output$summary <- renderText({
        samples_concrete <- samples()
        paste("Finished calculation. You have", length(samples_concrete),
              "random samples of 10 values each Mean values of the first columns:",
              toString(sapply(samples_concrete, function(x) mean(x[[1]]))))
    })
}

shinyApp(ui = ui, server = server)
...