在Shining/Shining dashboard R中为反应式数据框创建新列

在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),

在shinyApp的服务器中,我根据输入创建了一个数据帧。但是,我想添加一个新列,该列利用该数据帧的两列

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)