R Shiny,-将多个用户输入传递到服务器中的单个数据帧中

问题描述

我必须承认我对 R-Shiny 比较陌生,所以如果这是一个非常基本的问题,我深表歉意。

我正在尝试创建一个 R-Shiny 应用程序,该应用程序接收与资产类别的预期年回报率、最大权重和最小权重相关的用户输入。理想情况下,我希望最终得到一个类似于下面的服务器数据帧,预期回报和权重可配置:

资产类别 Expected_Return 最大重量 Min_Weight
股权 0.08 1.00 0.25
债券 0.02 0.75 0.10
黄金 0.03 0.20 0.00
财产 0.05 0.30 0.00
现金 0.01 0.10 0.00

我的用户界面代码

library(shiny)



ui <- fluidPage(
   fluidRow(
       column(width = 1,align="center",checkBoxInput("equity_include","Equity",value = TRUE,width = '100%')
       ),column(width = 5,numericInput("equity_er","Global Expected Annual Return (%)",value = 0)
       ),column(width = 3,numericInput("equity_maxw","Max Weight %",value = 100,min = 0,max = 100)
       ),numericInput("equity_minw","Min Weight %",value = 0,max = 100)
       )
   ),fluidRow(
       column(width = 1,checkBoxInput("bonds_include","Bonds",numericInput("bonds_er","Bonds Expected Annual Return (%)",numericInput("bonds_maxw",numericInput("bonds_minw",checkBoxInput("gold_include","Gold",numericInput("gold_er","Gold Expected Annual Return (%)",numericInput("gold_maxw",numericInput("gold_minw",checkBoxInput("property_include","Property",numericInput("property_er","Property Expected Annual Return(%)",numericInput("property_maxw",numericInput("property_minw",checkBoxInput("cash_include","Cash",numericInput("cash_er","Cash Expected Annual Return(%)",numericInput("cash_maxw",numericInput("cash_minw",)

我的服务器代码

server <- function(input,output) {
    library("tidyverse")
    library(plotly) # To create interactive charts
    library(timetk) # To manipulate the data series
    
    #Create Dataframe of User Inputs
    assets <- c("Equity","Cash")
    include <- c(input$equity_include,input$bonds_include,input$gold_include,input$property_include,input$cash_include)
    expected_return <- c(input$equity_er,input$bonds_er,input$gold_er,input$property_er,input$cash_er)
    max_weight <- c(input$equity_maxw,input$bonds_maxw,input$gold_maxw,input$property_maxw,input$cash_maxw)
    min_weight <- c(input$equity_minw,input$bonds_minw,input$gold_minw,input$property_minw,input$cash_minw)
    
    user_inputs <- data.frame(assets,include,expected_return,max_weight,min_weight)
   

不幸的是,我遇到了多个反应性错误,我无法使用典型的reactive() 函数解决这些问题。

非常感谢您能就此问题提供任何帮助。

先谢谢你!

解决方法

我知道答案通常应该解决您的特定问题,但我很懒惰输入所有这些默认值,您可以使用可编辑的数据框来完成此操作,我喜欢为此使用 DT 包

示例基于:https://yihui.shinyapps.io/DT-edit/

library(shiny)
library(DT)

dt_output = function(title,id) {
  fluidRow(column(
    12,h1(paste0('Table ',sub('.*?([0-9]+)$','\\1',id),': ',title)),hr(),DTOutput(id)
  ))
}
render_dt = function(data,editable = 'cell',server = TRUE,...) {
  renderDT(data,selection = 'none',server = server,editable = editable,...)
}

shinyApp(
  ui = fluidPage(
    title = 'Double-click to edit table rows',dt_output('server-side processing (editable = "row")','x6'),),server = function(input,output,session) {
    d6 = iris
    d6$Date = Sys.time() + seq_len(nrow(d6))
    
    options(DT.options = list(pageLength = 5))
    
    # server-side processing
    output$x6 = render_dt(d6,'row')
    
    # edit a row
    observeEvent(input$x6_cell_edit,{
      d6 <<- editData(d6,input$x6_cell_edit,'x6')
    })
    
})
,

如果你想保持旧的方法用reactive()包围向量,然后通过调用函数的名字来使用

library(shiny)
library(DT)

ui <- fluidPage(
  fluidRow(
    column(width = 1,align="center",checkboxInput("equity_include","Equity",value = TRUE,width = '100%')
    ),column(width = 5,numericInput("equity_er","Global Expected Annual Return (%)",value = 0)
    ),column(width = 3,numericInput("equity_maxw","Max Weight %",value = 100,min = 0,max = 100)
    ),numericInput("equity_minw","Min Weight %",value = 0,max = 100)
    )
  ),fluidRow(
    column(width = 1,checkboxInput("bonds_include","Bonds",numericInput("bonds_er","Bonds Expected Annual Return (%)",numericInput("bonds_maxw",numericInput("bonds_minw",checkboxInput("gold_include","Gold",numericInput("gold_er","Gold Expected Annual Return (%)",numericInput("gold_maxw",numericInput("gold_minw",checkboxInput("property_include","Property",numericInput("property_er","Property Expected Annual Return(%)",numericInput("property_maxw",numericInput("property_minw",checkboxInput("cash_include","Cash",numericInput("cash_er","Cash Expected Annual Return(%)",numericInput("cash_maxw",numericInput("cash_minw",fluidRow(dataTableOutput("data_example"))
)


server <- function(input,output) {
  library("tidyverse")
  library(plotly) # To create interactive charts
  library(timetk) # To manipulate the data series
  
  #Create Dataframe of User Inputs
  assets <- c("Equity","Cash")
  include <- reactive(c(input$equity_include,input$bonds_include,input$gold_include,input$property_include,input$cash_include))
  expected_return <- reactive(c(input$equity_er,input$bonds_er,input$gold_er,input$property_er,input$cash_er))
  max_weight <- reactive(c(input$equity_maxw,input$bonds_maxw,input$gold_maxw,input$property_maxw,input$cash_maxw))
  min_weight <- reactive(c(input$equity_minw,input$bonds_minw,input$gold_minw,input$property_minw,input$cash_minw))
  
  #user_inputs <- data.frame(assets,include(),expected_return(),max_weight(),min_weight())
  output$data_example <- renderDataTable(data.frame(assets,min_weight()))
}

shinyApp(ui,server)