通过进一步的函数传递 DT::renderDataTable 中的选定行以呈现另一个 table

Passing selected rows in a DT::renderDataTable through further functions to render another another table

第一次张贴者和整个 R 的新手,更不用说闪亮了,所以任何帮助都将不胜感激。

我想从一个数据表中的选定行中获取值,对这些数字执行一些操作(在本例中是找到两个数字的平均值),然后将它们呈现到第二个数据表,现在将有一个新数字,但第一列(在本例中为 'names')保持不变。 我希望下面的 MRE 能说明我正在尝试做的事情。

tab <- data.frame(names = c("shelly","bob","jim","frank","jess"),
                  numbers = c(30,45,55,70,90),
                  numbers2 = c(16,34,91,76,83)) 
tab$numbers<- paste(tab$numbers,tab$numbers2, sep = ',')
tab<-tab[,-3]
    
library(shiny)
library(DT)

# Define UI ----
ui <- fluidPage(
  titlePanel("simpleApp"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel (
      dataTableOutput("table"),
      dataTableOutput("select_table")
    )
  )
  
)

# Define server logic ----
server <- function(input, output) {
  
  output$table <- DT::renderDataTable(tab, selection='multiple')
  
  
  
  data3<- reactive({ 
    data.frame(tab[input$table_rows_selected,])})  
  
  output$select_table<-DT::renderDataTable({
    if(nrow(data3()) > 0) {
      transform(data3(), numbers = mean(tab[input$table_rows_selected]$numbers) 
#this is the part I'm having trouble with I think
    }
  })
}

# Run the app ----
shinyApp(ui = ui, server = server)

非常感谢任何帮助,感谢您对我的耐心等待! 干杯

试试这个 -

tab <- data.frame(names = c("shelly","bob","jim","frank","jess"),
                  numbers = c(30,45,55,70,90))

library(shiny)
library(DT)

# Define UI ----
ui <- fluidPage(
  titlePanel("simpleApp"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel (
      dataTableOutput("table"),
      dataTableOutput("select_table")
    )
  )
  
)

# Define server logic ----
server <- function(input, output) {
  
  output$table <- DT::renderDataTable(tab, selection='multiple')
  
 
    
    data3<- reactive({ 
      data.frame(tab[input$table_rows_selected,])})  
  
  output$select_table<-DT::renderDataTable({
    if(nrow(data3()) > 0) {
      transform(data3(), numbers = numbers - 12)
    }
    })
}

# Run the app ----
shinyApp(ui = ui, server = server)

编辑

对于更新问题,您可以将计算更改为 -

  output$select_table<-DT::renderDataTable({
    if(nrow(data3()) > 0) {
      transform(data3(), numbers = sapply(strsplit(tab$numbers[input$table_rows_selected], ','), function(x) sum(as.numeric(x))))
    }
  })