2015-06-09 7 views

ответ

1

В то время как rhandontable является реальной хорошей реализацией handsontable (кредит идет на @jrowen), в настоящее время он не включает getSelected().

Событие пользователя, изменяющее любую ячейку (включая выбор/снятие флажка), отслеживается блестящим. Это дает возможность использовать флажки, чтобы позволить пользователю выбирать (или отменять выбор) одну или несколько строк.

К сожалению, логика понимания того, что была выбрана, должна быть разработана на стороне сервера вашим кодом.

Фрагмент кода, приведенный ниже, может дать вам представление о том, как управлять им.

options(warn=-1) 
library(rhandsontable) 
library(shiny) 

options(warn=-1) 
quantity <- id <- 1:20 
label <- paste0("lab","-",quantity) 
pick <- FALSE 
iris_ <- data.frame(id=id,pick=pick, quantity=quantity,label=label,iris[1:20,] ,stringsAsFactors = FALSE) 
mtcars_ <- data.frame(id=id,pick=pick, quantity=quantity,label=label,mtcars[1:20,] ,stringsAsFactors = FALSE) 
iris_$Species <- NULL # i.e. no factors 
#--------------------------- 
ui <- fluidPage(
    fluidRow(
     column(6,rHandsontableOutput('demTb')), 
     column(3,uiOutput("demSli")), 
    column(3, radioButtons("inButtn", label=NULL, choices= c("iris","mtcars"), selected = "iris", inline = TRUE)) 
     ) 
    ) 

server <- function(session, input, output) { 

selData <- "" 


output$demSli <- renderUI({ 

if(is.null(input$demTb)) return() 

isolate({ 
df_ <- hot_to_r(input$demTb) 
index <- which(df_$pick==T) 
if(length(index)==0) return() 
labs <- iris_$label[index] 
pages <- "test" 
iter <- length(labs) 
buttn <- 1 
valLabs <- sapply(1:iter, function(i) { 
if(is.null(input[[paste0(pages,"d",labs[i],buttn)]])) { 
      0 
} else { as.numeric(input[[paste0(pages,"d",labs[i],buttn)]]) } 
}) 
# 
toRender <- lapply(1:iter, function(i) { 
    sliderInput(inputId = paste0(pages,"d",labs[i],buttn), 
       label = h6(paste0(labs[i],"")), 
       min = -100, 
       max = 100, 
       step = 1, 
       value = valLabs[i], 
       post="%", 
       ticks = FALSE, animate = FALSE) 
       }) 
}) 
     return(toRender) 

}) 
#-------------------- 
rds <- reactive({ 

    # if(is.null(input$demTb)) { 
    if(input$inButtn == "iris") { 
     if(selData == "" | selData == "mtcars") { 
     selData <<- "iris" 

     return(iris_) # first time for iris 
     } 
    } else { 
     if(selData == "iris") { 
     selData <<- "mtcars" 

     return(mtcars_) # first time for mtcars 
     } 
    } 

df_ <- hot_to_r(input$demTb) 
isolate({ 

index <- which(df_$pick==T) 
if(length(index)==0) return(df_) 
labs <- iris_$label[index] 
pages <- "test" 
iter <- length(labs) 
buttn <- 1 
}) # end isolate 
valLabs <- sapply(1:iter, function(i) { 
    if(is.null(input[[paste0(pages,"d",labs[i],buttn)]])) { 
     0 
    } else { 
     as.numeric(input[[paste0(pages,"d",labs[i],buttn)]])/100 
    } 
    }) 

    dft_ <- data.frame(label=labs, multi=valLabs, stringsAsFactors = FALSE) 
    dft_ <- merge(iris_,dft_,by="label", all.x=T) 

    dft_$quantity <- sapply(1:length(dft_$quantity), function(z) { 
    if(is.na(dft_$multi[z])) { 
    dft_$quantity[z] 
    } else { iris_$quantity[z]*(1 + dft_$multi[z]) } 
}) 
dft_[with(dft_,order(as.numeric(id))),] 
df_[with(df_,order(as.numeric(id))),] 

df_$quantity <- df_$quantity 
    return(df_) 
    }) 


output$demTb <- renderRHandsontable({ 


if(is.null(rds())) return() 

df_ <- rds() 

df_ <- df_[with(df_,order(as.numeric(id))),] 

rhandsontable(df_, readOnly = FALSE, rowHeaders= NULL, useTypes= TRUE) %>% 
    hot_table(highlightCol = TRUE, highlightRow = TRUE) 


}) 

} 


shinyApp(ui, server) 
6

Вы можете получить выбранные значения строк, столбцов, диапазонов и ячеек, а также отредактированные ячейки с помощью selectCallback = TRUE. Вы можете отредактировать ячейку, дважды щелкнув по ней, и принять изменения, нажав «return» или «enter».

Минимальный пример:

library(shiny) 
library(rhandsontable) 
ui=fluidPage(
    rHandsontableOutput('table'), 
    verbatimTextOutput('selected') 
) 

server=function(input,output,session)({ 
    df=data.frame(N=c(1:10),L=LETTERS[1:10],M=LETTERS[11:20]) 
    output$table=renderRHandsontable(
    rhandsontable(df,selectCallback = TRUE,readOnly = FALSE) 
) 
    output$selected=renderPrint({ 
    cat('Selected Row:',input$table_select$select$r) 
    cat('\nSelected Column:',input$table_select$select$c) 
    cat('\nSelected Cell Value:', 
     input$table_select$data[[ 
      input$table_select$select$r]][[input$table_select$select$c]]) 
    cat('\nSelected Range: R',input$table_select$select$r, 
     'C',input$table_select$select$c,':R',input$table_select$select$r2, 
     'C',input$table_select$select$c2,sep="") 
    cat('\nChanged Cell Row Column:',input$table$changes$changes[[1]][[1]], 
     input$table$changes$changes[[1]][[2]])  
    cat('\nChanged Cell Old Value:',input$table$changes$changes[[1]][[3]]) 
    cat('\nChanged Cell New Value:',input$table$changes$changes[[1]][[4]]) 
    }) 
}) # end server 
shinyApp(ui = ui, server = server) 
+1

Хорошо, спасибо. Одно замечание: два значения «+ 1» для значения ячейки должны быть удалены. –

+0

К сожалению, я исправил его, спасибо! –

Смежные вопросы