r - 从 Shiny 数据表中的单元格获取值

标签 r datatable shiny expss

我有一个 Shiny 的数据表,我想在单击一行时从变量文本框中的第一列获取值。

Screenshot here

因此,在这种情况下,如屏幕截图所示,当我单击这一行时,我想得到 Factuur Factuur在现在的地方Error: object of type 'closure' is not subsettable 。 我设法获取行号:

UI: p(verbatimTextOutput('chauffeurdetails'))

Server: output$chauffeurdetails = renderText ({ chauffeurdetail = input$results_rows_selected })

有人想过如何从第一列获取值而不是仅获取行号吗?

整个 R 代码:

# install packages if needed
if (!require("DT")) install.packages("DT")
if (!require("tidyr")) install.packages("tidyr")
if (!require("dplyr")) install.packages("dplyr")
if (!require("readxl")) install.packages("readxl")
if (!require("shiny")) install.packages("shiny")
if (!require("expss")) install.packages("expss")

# activate packages
library("tidyr")
library("dplyr")
library("readxl")
library("DT")
library("shiny")
library("expss")

# Lees MI bestand
MIinport <- read_excel("~/Documents/MI.xlsx", col_types = c("skip", "skip", "text", "skip", "text", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "text", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "text","skip",  "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "text","skip",  "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip", "skip"))
# Hernoem kolommen
MIinport <- unite(MIinport, KlantRef, Klant, Referentie, sep=" | ", remove = TRUE)
colnames(MIinport)<- c("Chauffeur", "Kenteken", "Klant", "ARDNK")
# Filter locatiewerk
MIinport <- subset(MIinport, is.na(MIinport$Kenteken))
MIinport$Kenteken <- NULL

DNK <- subset(MIinport, ARDNK == "DNK")
DNK$ARDNK <- NULL
AR <- subset(MIinport, ARDNK == "AR")
AR$ARDNK <- NULL

DNKfreq1 <- ftable(DNK$Chauffeur, DNK$Klant, dnn = c("Chauffeur", "Klant"))
DNKfreq2 <- as.data.frame(DNKfreq1)
DNKdata <- subset(DNKfreq2, Freq>0)
colnames(DNKdata)<- c("Chauffeur", "Klant", "Aantal")
list.DNKklanten <- as.list(unique(sort(DNKdata$Klant)))

ARfreq1 <- ftable(AR$Chauffeur, AR$Klant, dnn = c("Chauffeur", "Klant"))
ARfreq2 <- as.data.frame(ARfreq1)
ARdata <- subset(ARfreq2, Freq>0)
colnames(ARdata)<- c("Chauffeur", "Klant", "Aantal")
list.ARklanten <- as.list(unique(sort(ARdata$Klant)))

# Onderscheid studenten - FALSE = Student | TRUE = Senior
ARdata$Student <- as.numeric(grepl('[.]', ARdata$Chauffeur))
ARstudent <- subset(ARdata, Student == 0)
ARstudent$Student <- NULL
ARdata$Student <- NULL


# App
library(shiny)

ui <- basicPage(
  p (""),
  sidebarLayout(
    sidebarPanel(
      div(
      h3("Zoek instellingen"),
      uiOutput("chooselist"),
      checkboxInput("StudentOption", label = "Alleen studenten", value = FALSE),
      radioButtons("ARofDNK", label = "AR of DNK", choices = c("AR", "DNK"), selected = "AR", inline = TRUE)
    ),
    div(tags$hr(),
        h3("Chauffeur details"),
        p(textOutput('chauffeurdetails')))),

    mainPanel(
      DT::dataTableOutput("results")
    )
  )
)
server <- function(input, output, session) {
# update datatable
output$chooselist <- renderUI({ 
  if (input$ARofDNK == "AR"){
    tagList(
    selectInput("select", "Selecteer een klant", choices = c(" ", list.ARklanten))
    )
  } else {
    tagList(
    selectInput("select", "Selecteer een klant", choices = c(" ", list.DNKklanten))
    )
  }
  })
  output$value <- renderPrint({ input$ARofDNK })

  SelectedKlant <- reactive({
    if (input$StudentOption == TRUE & input$ARofDNK == "AR") {
      a <- subset(ARstudent, (ARstudent$Klant == input$select))
      return(a)
    } 
    else if (input$StudentOption == FALSE & input$ARofDNK == "AR") {
      a <- subset(ARdata, (ARdata$Klant == input$select))
      return(a)
    } else if (input$ARofDNK == "DNK"){
      a <- subset(DNKdata, (DNKdata$Klant == input$select))
      return(a)
    }
})

  output$results <- DT::renderDataTable(SelectedKlant(), options = list(pageLength = 20, dom = 'tip', order = list(2,'desc')), rownames = FALSE, width = 500, elementId = "results", colnames=c('Naam', 'Locatie', 'Aantal'), selection = 'single')

#  output$chauffeurdetails = renderText ({
#    SelectedKlant()[input$results_rows_selected,1]
#  })

  output$chauffeurdetails = renderText ({
    req(length(input$results_rows_selected)>0)
    SelectedKlant()[input$results_rows_selected,1]
  })  

# output$chauffeurdetails = renderText ({
#     chauffeurdetail = input$results_rows_selected
# })

  session$onSessionEnded(function() {
    stopApp()
  })
  session$on

  }

# Run the application 
shinyApp(ui = ui, server = server, options = list(launch.browser=TRUE))

编辑: 示例数据:https://www.dropbox.com/s/zjxusxcan0ps1s3/Input%20Test.xlsx?dl=0 这些数据包含隐私敏感信息,因此我创建了一个小型替代品。

最佳答案

output$chauffeurdetails = renderText ({ SelectedKlant()[input$results_rows_selected,1] })

应该可以解决。

你的最后一个问题是经典的stringAsFactor第一列是一个因素,我们需要将其转换为字符 as.character()

这是服务器代码的工作版本

server <- function(input, output, session) {
  # update datatable
  output$chooselist <- renderUI({ 
    if (input$ARofDNK == "AR"){
      tagList(
        selectInput("select", "Selecteer een klant", choices = c(" ", list.ARklanten))
      )
    } else {
      tagList(
        selectInput("select", "Selecteer een klant", choices = c(" ", list.DNKklanten))
      )
    }
  })
  output$value <- renderPrint({ input$ARofDNK })

  SelectedKlant <- reactive({
    if (input$StudentOption == TRUE & input$ARofDNK == "AR") {
      a <- subset(ARstudent, (ARstudent$Klant == input$select))
      return(a)
    } 
    else if (input$StudentOption == FALSE & input$ARofDNK == "AR") {
      a <- subset(ARdata, (ARdata$Klant == input$select))
      return(a)
    } else if (input$ARofDNK == "DNK"){
      a <- subset(DNKdata, (DNKdata$Klant == input$select))
      return(a)
    }
  })

  output$results <- DT::renderDataTable(SelectedKlant(), options = list(pageLength = 20, dom = 'tip', order = list(2,'desc')), rownames = TRUE, width = 500, elementId = "results", colnames=c('Naam', 'Locatie', 'Aantal'), selection = 'single')

  #  output$chauffeurdetails = renderText ({
  #    SelectedKlant()[input$results_rows_selected,1]
  #  })

  output$chauffeurdetails = renderText ({
    req(length(input$results_rows_selected)>0)
    as.character(SelectedKlant()[input$results_rows_selected,1])
  })  

  # output$chauffeurdetails = renderText ({
  #     chauffeurdetail = input$results_rows_selected
  # })

  session$onSessionEnded(function() {
    stopApp()
  })
  session$on

}

希望这有帮助!

关于r - 从 Shiny 数据表中的单元格获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47846335/

相关文章:

c# - 当多列数据匹配时,如何合并DataTable中的行?

r - 使用选项卡和 suspendWhenHidden = FALSE 优化 Shiny 性能

r - 添加单独的index.html作为主页并将shinyapp路由到其他页面

c++ - Rcpp:比较从 R 数据帧派生的字符串的巧妙方法?

r - 为什么 coord_map 会产生奇怪的输出?

java - Primefaces 链接打开电子邮件撰写窗口

jsf - p :commandButton in p:dataTable

r - 粘贴()和粘贴0()之间的区别

r - 图层中的子集参数不再适用于 ggplot2 >= 2.0.0

html - 如何在 Shiny App 中使用 URL 呈现 HTML 文件而不破坏其他交互式绘图和表格?