在Shining/Shining dashboard R中为反应式数据框创建新列
在shinyApp的服务器中,我根据输入创建了一个数据帧。但是,我想添加一个新列,该列利用该数据帧的两列在Shining/Shining dashboard R中为反应式数据框创建新列,r,shiny,shinydashboard,R,Shiny,Shinydashboard,在shinyApp的服务器中,我根据输入创建了一个数据帧。但是,我想添加一个新列,该列利用该数据帧的两列 server <- function(input, output, session) { l.out <- reactive({ BatchGetSymbols(tickers = input$stock, first.date = Sys.Date() - as.integer(input$length),
server <- function(input, output, session) {
l.out <- reactive({
BatchGetSymbols(tickers = input$stock,
first.date = Sys.Date() - as.integer(input$length),
last.date = Sys.Date())
})
stock_info <- reactive({
l.out()$df.tickers
})
stock_info()$return <- reactive({
rep(0, length(stock_info()$ref.date))
})
stock_info()$return <- reactive({
for (i in 2:length(stock_info()$ref.date)){
stock_info()$return[i] <- ((stock_info()$price.close[i] -
stock_info()$price.close[i - 1]) / stock_info$price.close[i - 1])
}
})
server我不熟悉BatchGetSymbols
包,但是下面示例中的概念也应该适用于您的用例
首先,由于缺乏优雅的表达方式,我很确定这个表达方式
stock_info()$return <- reactive({
rep(0, length(stock_info()$ref.date))
})
但是,如果您将中间对象l.out
用于各种最终输出,那么将其作为自己的反应对象可能是有意义的。然后,我们可以在相关输入发生变化时更新l.out
,然后使用该中间变量通过其他下游反应器级联更新
此外,我们可以基于不影响l.out
的其他条件更新下游反应对象,如stock\u info
,而无需每次重新运行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 will change with input$length and input$stock
## but NOT input$displayLength
l.out <- reactive({
data.frame(stock = input$stock,
foo = rnorm(input$length),
l.out_update_time = Sys.time())
})
## stock_info will update whenever l.out changes or the displayLength changes.
## l.out will NOT be updated if only input$displayLength changes
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)
})
## Return an output
output$my_table <- renderDataTable({
stock_info()
})
}
shinyApp(ui, server)
库(闪亮)
ui看一看,如果你能根据这些建议更新你的例子,这将有助于其他人帮助你!我可以发布完整的代码,如果这让事情更容易。显然,用户界面代码和大量多余的服务器代码将不适用,但这将使您更好地了解整个情况。您最初的直觉是正确的,即发布完整代码会使水中混入无关信息。示例代码应包括加载所使用的任何包--库(闪亮)
,库(BatchGetSymbols)
,等等。。示例ui
理想情况下只有input$stock
,input$length
(使用工作默认值),以及一个打印所需结果数据帧的表输出,stock\u info
。示例server
您拥有的代码足够了(即使它不起作用)。BatchGetSymbols包从internet获取大量股票信息,然后将其存储为自己的一组数据帧,这就是为什么我需要在获取l.out()$df.tickers之前将其存储为l.out,该数据帧包含最相关的股票信息(收盘价等)。基本上,一旦我有了l.out和stock_信息,每当我逐字运行这个示例时,我只会收到错误消息。如果您可以使用硬编码输入包含一个工作的BatchGetSymbols()
调用,这也会很有帮助。库(BatchGetSymbols)#首先设置日期。日期
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 will change with input$length and input$stock
## but NOT input$displayLength
l.out <- reactive({
data.frame(stock = input$stock,
foo = rnorm(input$length),
l.out_update_time = Sys.time())
})
## stock_info will update whenever l.out changes or the displayLength changes.
## l.out will NOT be updated if only input$displayLength changes
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)
})
## Return an output
output$my_table <- renderDataTable({
stock_info()
})
}
shinyApp(ui, server)