簡體   English   中英

根據 shiny 小部件的值向現有 dataframe 添加新行

[英]Add a new row to existing dataframe based on shiny widgets' values

我有 shiny 應用程序,默認情況下通過表格顯示數據集。 然后在側邊欄中有 5 個小部件對應於表格的 5 列。 然后是一個動作按鈕。

添加:如果用戶按下Add ,那么他會在表格中添加一個帶有所選小部件值的新行。

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(DT)
Input<-structure(list(`Security Type` = c("Stock", "Stock", "Load Fund"
), Ticker = c("XOM", "NFLX", "AMCPX"), `Purchase Date` = structure(c(16070, 
                                                                     17084, 17084), class = "Date"), `Sale Date` = structure(c(18627, 
                                                                                                                               NA, 18545), class = "Date"), `Amount Invested` = c("$10,000", 
                                                                                                                                                                                  "$8,000", "$10,000")), class = c("spec_tbl_df", "tbl_df", "tbl", 
                                                                                                                                                                                                                   "data.frame"), row.names = c(NA, -3L))
shinyApp(
  ui = tags$body(class="skin-blue sidebar-mini control-sidebar-open",dashboardPage(
    options = list(sidebarExpandOnHover = TRUE),
    header = dashboardHeader(title = "Investment Advisor Monitoring - Insider Trading",titleWidth = 450),
    
    sidebar = dashboardSidebar(minified = F, collapsed = F,
                               selectInput("sectype", "Security Type",
                                           c(unique(Input$`Security Type`))),
                               selectInput("sectick", "Ticker",
                                           c(unique(Input$Ticker))),
                               dateInput("PurDate", "Purchase Date", value = as.Date("2013-12-31")),
                               dateInput("selDate", "Sale Date", value = as.Date("2019-01-31")),
                               selectInput("aminv", "Amount Invested",
                                           c(unique(Input$`Amount Invested`))),
                               actionButton("add","Add")
                               #actionButton("edit","Edit"),
                               #actionButton("del","Delete")
                               
    ),
    body = dashboardBody(
      h3('Results'),
      tabsetPanel(id = "tabs",
                  tabPanel("InsiderTraining",
                           dataTableOutput("TBL1")
                  )
      )
    ),
    controlbar = dashboardControlbar(width = 300
    ),
    title = "DashboardPage"
  )),
  server = function(input, output) { 
    
    output$TBL1<-renderDataTable(
      datatable(Input)    )
    
  }
)

您可以創建稱為data的響應值,該值會在單擊按鈕時更新。 然后可以使用shiny::isolate將輸入的當前值凍結到表中:

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(DT)
Input <- structure(list(`Security Type` = c("Stock", "Stock", "Load Fund"), Ticker = c("XOM", "NFLX", "AMCPX"), `Purchase Date` = structure(c(
  16070,
  17084, 17084
), class = "Date"), `Sale Date` = structure(c(
  18627,
  NA, 18545
), class = "Date"), `Amount Invested` = c(
  "$10,000",
  "$8,000", "$10,000"
)), class = c(
  "spec_tbl_df", "tbl_df", "tbl",
  "data.frame"
), row.names = c(NA, -3L))
shinyApp(
  ui = tags$body(class = "skin-blue sidebar-mini control-sidebar-open", dashboardPage(
    options = list(sidebarExpandOnHover = TRUE),
    header = dashboardHeader(title = "Investment Advisor Monitoring - Insider Trading", titleWidth = 450),
    sidebar = dashboardSidebar(
      minified = F, collapsed = F,
      selectInput(
        "sectype", "Security Type",
        c(unique(Input$`Security Type`))
      ),
      selectInput(
        "sectick", "Ticker",
        c(unique(Input$Ticker))
      ),
      dateInput("PurDate", "Purchase Date", value = as.Date("2013-12-31")),
      dateInput("selDate", "Sale Date", value = as.Date("2019-01-31")),
      selectInput(
        "aminv", "Amount Invested",
        c(unique(Input$`Amount Invested`))
      ),
      actionButton("add", "Add")
    ),
    body = dashboardBody(
      h3("Results"),
      tabsetPanel(
        id = "tabs",
        tabPanel(
          "InsiderTraining",
          dataTableOutput("TBL1")
        )
      )
    ),
    controlbar = dashboardControlbar(width = 300),
    title = "DashboardPage"
  )),
  server = function(input, output) {
    # Init with some example data
    data <- reactiveVal(Input)

    observeEvent(
      input$add,
      {
        # start with current data
        data() %>%
          add_row(
            `Security Type` = isolate(input$sectype),
            Ticker = isolate(input$sectick),
            `Purchase Date` = isolate(input$PurDate),
            `Sale Date` = isolate(input$selDate),
            `Amount Invested` = isolate(input$aminv)
          ) %>%
          # update data value
          data()
      }
    )

    output$TBL1 <- renderDataTable(
      datatable(data())
    )
  }
)


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM