2017-12-16 40 views
0

Shiny에서이 DataTable을 가지고 있는데 행을 클릭하면 변수 텍스트 상자의 첫 번째 열에서 값을 가져오고 싶습니다. Shiny DataTable의 셀에서 값 가져 오기

Screenshot here

그래서 스크린 샷에서 볼 수 있듯이,이 경우, 나는이 행을 클릭하면, 지금 Error: object of type 'closure' is not subsettable있는 장소에 Factuur Factuur을 좀하고 싶습니다. 내가 행 번호를 얻을 수 있었다 :

UI : p(verbatimTextOutput('chauffeurdetails'))

서버 : 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 그 데이터는 개인 정보 보호에 민감한 정보가 포함되어 있습니다, 그래서 작은 교체를 만들었습니다.

+0

오류를 발생시키는 코드를 게시 할 수 있습니까? – SBista

+0

@SBista 위 코드는 작동하며 행 번호를 보여줍니다. – George

+0

@SBista 나는 ARstudent' 당신이'ARstudent을' – George

답변

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 

} 
의 작업 버전입니다

이것이 도움이되기를 바랍니다!

+0

이제 난 임의의 숫자를 얻었습니다. 귀하의 조정 외에도 UI의'verbatimTextOutput'을'TextOutput'으로 변경했습니다. 그렇지 않으면 전혀 작동하지 않았습니다. 이견있는 사람? – George

+0

안녕하세요 @ 조지 내가 작업 예제를 추가했습니다. 이 방법이 효과가 없다면 더 많은 정보가 필요하며 작업하는 샘플 데이터가 더 바람직합니다. 나는 작은 표본을 입을 수있다. –

+0

@Berlin Baron, 나는 노력했다. 그러나 불행하게도, 나는 여전히 반응으로 숫자를 받는다. 요청에 따라 샘플 포스트를 게시했습니다. 내가 본 것을 재현 할 수 있기를 바랍니다. 대신 전체 코드를 삭제 했으므로 이해하는 데 도움이됩니다. – George