【发布时间】:2020-06-13 10:32:54
【问题描述】:
我刚开始研究闪亮的应用程序,所以这很可能是一个非常基本的问题,但是在搜索论坛后我仍然无法得到它。
作为我的第一个应用程序的一部分,我有一个精确的 100000 个案例的模拟群体,我想使用 for 循环从中抽取 n 个随机样本。 所以一般的代码是这样的:
samples<-list(NULL)
for(i in 1:100){samples[[i]]<-dplyr::sample_n(population, size=200, replace=FALSE)}
现在我想包含一个滑块,它替换 for 循环中的 100,以便用户可以决定要绘制多少个样本。 但是,当在 UI 中定义滑块然后在服务器端尝试以下操作时
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)}
})
以及带有 reactiveVal()、reactiveValues() 和各种变体但没有成功的版本。
所以基本上,我想要的是用户通过滑块选择的值决定了我的 for 循环中的重复次数。
我也看到了这个帖子,但不知道这是否是一个类似的问题: For loop inside reactive function in Shiny 希望有人能对此有所了解。
【问题讨论】:
-
尝试使用
observer({})或使用其中一种输出函数,即renderPlot、renderDataTable... -
您的第二次尝试是一个不错的选择。但是您需要返回列表:
samples <- reactive({ out <- vector("list", input$n_samples) \\ for(i in 1:length(out)){out[[i]] <- ......} \\ out })。我使用“\\”来表示换行符(我们不能在 cmets 中进行换行符)。然后在响应式上下文中执行samples()以获取此列表。
标签: r loops shiny reactive-programming