gpt4 book ai didi

r - 在 Shiny / Shiny 仪表板 R 中为 react 数据框创建新列

转载 作者:行者123 更新时间:2023-12-03 20:19:13 25 4
gpt4 key购买 nike

在我的 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])
}
})

我已经像这样尝试过,它一直有效,直到我尝试创建 stock_info()$return,在那里我不断收到 NULL 留下分配的错误。
有小费吗?

最佳答案

我不熟悉 BatchGetSymbols包,但下面示例中的概念也应该适用于您的用例。

首先,由于缺乏优雅的表达方式,我很确定这个表达......

  stock_info()$return <- reactive({
rep(0, length(stock_info()$ref.date))
})

...只是不是真的如何 shiny响应式(Reactive)对象和相关的语法工作。

看起来您可以通过将一堆中间步骤压缩为一个表达式来大大简化您的代码。如果您只有一组将在所有输出中使用的 react 性数据,这可能是一种更直接的方法。
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) {

## This will update whenever either input$length or input$stock change
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)
})

## Return an output
output$my_table <- renderDataTable({
stock_info()
})
}

shinyApp(ui, server)

但是,如果您使用的是中间对象 l.out对于各种最终输出,让它成为它自己的 react 对象可能是有意义的。然后,我们可以更新 l.out每当相关输入发生变化时,然后使用该中间变量通过其他下游 react 级联更新。

此外,我们可以更新下游 react 对象,如 stock_info基于不影响的其他条件 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 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)

关于r - 在 Shiny / Shiny 仪表板 R 中为 react 数据框创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48652185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com