我在R Markdown文档中使用闪亮的小部件。在以前创建闪亮的应用程序时(不在Markdown上下文中),我能够创建只加载一次的大型静态数据集全局变量。我现在正尝试在Markdown文档中做类似的事情。
我在CSV文件中有超过5000个项目的列表。我将每天随机拉一个,然后在程序中使用它来生成一些信息和图表。我希望每个人的随机项目每天都相同,这就是我遇到的问题。我知道如果它只是每个会话的一个新的随机项目,如何让它工作,但我不知道如何使每个会话相同。
---
#title: "Daily Random Thing"
#author: "Tyler Beason"
#date: "Wednesday, June 24, 2015"
output: html_document
runtime: shiny
---
```{r,echo=FALSE}
symbolList <- read.csv('symbolList.csv',stringsAsFactors=FALSE, header=TRUE) #this is what I want to be global
checkFun <- function()
{
Sys.time()
}
valueFun <- function()
{
Sys.time()
}
today <- reactivePoll(5000,NULL, checkFun, valueFun) #only set to 5000ms for testing FYI
valueFun2 <- function()
{
sample(1:nrow(symbolList),1)
}
rand <- reactivePoll(5000,NULL,checkFun,valueFun2)
todayThing <- reactive({symbolList[rand(),1]})
renderPrint({todayThing()})
#...go on to do more things with todayThing
```
#Title and such
如何使程序工作,以便每天访问一次symbolList并拉出一个新的随机项,重新生成页面的其余部分(我可以做),然后保持静态(和完全相同)用户直到第二天?我知道这很可能都是服务器端完成的,但我不能把它拼凑在一起。
希望这是有道理的。
答案 0 :(得分:0)
你可以做这样的事情,使用Sys.Date()
和set.seed
使其每天都一样
set.seed(floor(as.numeric(Sys.Date())))
num_rows <- 5000
n <- sample(num_rows, 1)
然后从你的.csv获取第n项。
library(shiny)
shinyApp(
shinyUI(
fluidPage(
textOutput("stuff")
)
),
shinyServer(function(input, output, session) {
values <- reactiveValues()
values$n <- 0
observe({
## Something like: difftime(Sys.Date()+1, Sys.Date(), units="sec")*1000
## to update everyday
invalidateLater(1000, session) # update n every second
isolate( values$n <- values$n + 1 )
})
output$stuff <- renderPrint({
sprintf("Stuff is %s", values$n)
})
})
)