2015-08-21 89 views
-1

我正在尝试为班级写一个Shiny应用程序,我正在教这个应用程序,从数据集中抽取一个随机样本并计算总结统计。每当我按下UI上的重置按钮时,都应该对新子集进行采样。这里是我的代码到目前为止:R Shiny not randomizing

shinyServer(function(input, output) { 

# Output for Ch. 1 Problems: Central Tendency 

# Prepare data 
observeEvent(input$Ch1.Prob.CT.reset, { 
    Ch1.Prob.CT.n <- sample(8:12, 1) 
    Ch1.Prob.CT.obs <- sample(1:nrow(cars), Ch1.Prob.CT.n) 
}) 
data <- eventReactive(input$Ch1.Prob.CT.reset, { 
    cars[Ch1.Prob.CT.obs, 'dist', drop=F] 
}) 

# Outputs 
output$Ch1.Prob.CT.Data <- renderDataTable({ 
    data() 
}) 

output$Ch1.Prob.CT.Mean.out <- renderUI({ 
    if (is.na(input$Ch1.Prob.CT.Mean.in)) { # Error checking 
     p("No answer provided") 
    } else if (round(input$Ch1.Prob.CT.Mean.in, digits = 4) == round(mean(Ch1.Prob.CT.data[,1]), digits = 4)) { 
     p("Correct", style = "color:green") 
    } else { 
     p("Incorrect", style = "color:red") 
    } 
}) 
}) 

问题是,样本不是随机的;每次都是一样的。即使按下重置按钮,样本也与之前的样本完全相同。

为什么Shiny不随机化?我怎样才能使它再次随机化?

+0

这是不建议使用s在闪闪发光的元素名称(例如。使用'Ch1_Prob_CT_reset'而不是'Ch1.Prob.CT.reset') –

+0

此外,我很久没有使用Shiny,所以我不太确定,但我会尝试设置'Ch1.Prob.CT.obs 'data'无功元素中,* not *在观察者中。如果你想在观察者中更新它,你应该使用一个反应变量。 –

回答

0

这样的代码之前:

observeEvent(input$xxx, { 
x <- ... 
}) 
f <- eventReactive(input$xxx, { 
[do something with x] 
}) 

不起作用。

你可以简单地删除观察,并做:

f <- eventReactive(input$xxx, { 
x <- ... 
[do something with x] 
}) 

如果你想使用一个变量加以修饰观察员里面,你必须使用一个反应列表,像这样:

values <- reactiveValues() 
values$x <- [initial value of x] 
observeEvent(input$xxx, { 
values$x <- ... 
}) 

(另外,不要在闪亮元素的名称使用的一些点(.)。)

0

添加一行如

set.seed(as.integer(Sys.time())) 

你需要的随机数

+0

我认为这与种子无关。问题仅仅是由于“重置按钮”对输出没有影响。 –

+0

在示例命令之前,我在https://floatsd.shinyapps.io/GeoCUI/ demo页面中添加了这一行(以数字形式),但似乎无法按预期工作。 – floatsd