我不熟悉BatchGetSymbols
包,但是下面示例中的概念也应适用于您的用例。
首先,毫无优雅的说法,我相信表达式...
stock_info()$return <- reactive({
rep(0, length(stock_info()$ref.date))
})
这并不是shiny
反应式对象及其相关语法的工作方式。
看起来你可以通过将一堆中间步骤压缩成单个表达式来简化你的代码。如果你只有一个响应数据集,它将用于所有输出,那么这可能是一种更直接的方法。
library(shiny)
ui <- fluidPage(
textInput('stock','stock',"GE"),
sliderInput('length', 'length', min = 1, max = 10, value = 5),
dataTableOutput('my_table')
)
server <- function(input, output, session) {
stock_info <- reactive({
length <- as.integer(input$length)
temp_stock_info <- data.frame(stock = input$stock,
foo = seq_len(length),
bar = rnorm(length))
temp_stock_info$baz <- paste("xxx",length)
return(temp_stock_info)
})
output$my_table <- renderDataTable({
stock_info()
})
}
shinyApp(ui, server)
然而,如果您正在使用中间对象l.out
用于各种最终输出,将其作为自己的反应性对象可能是有意义的。然后,我们可以在相关输入更改时更新l.out
,然后使用该中间变量通过其他下游反应性级联更新。
此外,我们可以根据不影响l.out
的其他条件更新下游反应性对象,而无需每次重新运行l.out
。
library(shiny)
ui <- fluidPage(
textInput('stock','stock',"GE"),
sliderInput('length', 'length', min = 1, max = 100, value = 50),
sliderInput('displayLength', 'displayLength', min = 1, max = 20, value = 5),
dataTableOutput('my_table')
)
server <- function(input, output, session) {
l.out <- reactive({
data.frame(stock = input$stock,
foo = rnorm(input$length),
l.out_update_time = Sys.time())
})
stock_info <- reactive({
tmp_stock_info <- head(x = l.out(), n = input$displayLength)
tmp_stock_info$stock_info_update_time <- Sys.time()
return(tmp_stock_info)
})
output$my_table <- renderDataTable({
stock_info()
})
}
shinyApp(ui, server)
library(shiny)
,library(BatchGetSymbols)
等。示例ui
应只包括input$stock
,input$length
(具有工作默认值) 和表格输出打印所需结果数据框stock_info
。你已经有了足够的示例server
代码_(即使它不起作用)_。这里是可能看起来像什么的 gist。 - Matt Summersgill