R Shiny:创建X个数字输入框,等于变量的数量



我正在尝试创建一个与财务相关的R Shiny应用程序。到目前为止,我有一个选项卡来创建一个自定义公文包,这要求我为原始source_file中的每个变量都有一个numericInput。这就是示例source_file的样子:

上海STI+5%<10%>-8%10%-3%>
日期 CSI500CSI300HSI
2016-01-01 +5%+12%
2016-01-08 +3% +13%-3%
2016-01-15 +2% +11%+4%-15%

这里有一个演示可能对您有所帮助。

您可以将.csv文件上传到闪亮的应用程序。它将忽略第一列(或者您可以修改以专门删除日期列(。

数字输入将根据读取的标题列名动态生成。

该演示有一个calc按钮,它将存储输入数据并用于进一步处理(计算回报(。还添加了一个表格来显示输入的数据。

编辑:如果按下calc按钮后想要调用自定义函数(calculate_portfolio_returns(,则可以在eventReactive中将调用添加到该函数,因为这取决于输入按钮。要传递数字输入的值,可以将这些值临时存储在向量vals中,然后将vals作为参数传递给函数(请参阅下面的修改代码(。在演示中,我调用了一个自定义函数calc_sum,它将在控制台中打印数字输入的总和。最后要注意的是,我在input_vals()的末尾添加了一个显式的return,这样vals就可以共享以在output$table中使用。

library(shiny)
ui <- fluidPage(
fileInput(inputId = "upload_file", "", accept = '.csv'),
uiOutput("num_inputs"),
actionButton("calc", "Calculate"),
tableOutput("table")
)
server <- function(input, output, session) {

data <- reactive({
infile <- input$upload_file
if (is.null(infile))
return(NULL)
read.csv(infile$datapath, header = TRUE, sep = ",")
})

header_vars <- reactive({
names(data()[-1])
})

output$num_inputs <- renderUI({
vars <- length(header_vars())
if (vars > 0) {
div(
lapply(seq(vars), function(x) {
numericInput(inputId = paste0("var_", x), label = header_vars()[x], value = 0, min = 0, max = 100)
})
)
}
})

input_vals <- eventReactive(input$calc, {
n_vars <- length(header_vars())
vals <- c()
if (n_vars > 0) {
vals <- sapply(seq(n_vars), function(i) {
input[[paste0("var_", i)]]
}) 
}
calc_sum(vals)
return(vals)
})

calc_sum <- function(vals) {
print(sum(vals))
}

output$table <- renderTable({
data.frame(
vars = header_vars(),
vals = input_vals()
)
})

}
shinyApp(ui = ui, server = server)

最新更新