我正在尝试创建一个与财务相关的R Shiny应用程序。到目前为止,我有一个选项卡来创建一个自定义公文包,这要求我为原始source_file
中的每个变量都有一个numericInput
。这就是示例source_file
的样子:
日期 | CSI500 | 上海CSI300 | HSI | STI|
---|---|---|---|---|
2016-01-01 | +5% | +5%<10%>+12% | ||
2016-01-08 | +3% | +13% | -8%-3% | 10%|
2016-01-15 | +2% | +11% | -3%+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)