问题
I hope you're well. I am trying to create a shiny dashboard whereby a user is able to update one rhandsontable from another. My code is as follows:
library(shiny)
library(rhandsontable)
channel <- c("TV","Radio","Digital")
start.date <- as.Date("2017-01-01")
end.date <- as.Date("2017-01-07")
date.range <- as.POSIXct((seq(start.date,end.date,by="day")), origin = "1970-01-01")
date.range <- as.data.frame(date.range)
colnames(date.range) <- c("date")
date.range[channel] <- 0
table1 <- date.range
table2 <- date.range
#Define the tables.
ui <- fluidPage(
br(),
fluidRow(
column(4, rHandsontableOutput("table1output")),
column(4, rHandsontableOutput("table2output"))
))
server <- function(input,output,session){
table <- reactiveValues()
table$table1 <- table1
table$table2 <- table2
#define reactive values as table1 and table2
output$table1output <- renderRHandsontable({rhandsontable(table$table1)})
output$table2output <- renderRHandsontable({rhandsontable(table$table2)})
#rhandsontable outputs
observeEvent(input$table1output,{
df <- hot_to_r(input$table1output)
df <- as.data.frame(df)
table$table2 <- df
})
#if a user updates table1 table2 should also update.
observeEvent(input$table2output,{
df <- hot_to_r(input$table2output)
df <- as.data.frame(df)
table$table1 <- df
})
#if a user updates table2 table1 should also update.
}
shinyApp(ui = ui, server = server)
Whenever I run the code i get the following errors:
Warning: Error in as: no method or default for coercing “character” to “NA”
I can't for the life of me get this to work! Any help would be very much appreciated!
Cheers,
Harry
回答1:
Allowed date formats in rhandsontable
The first problem is the format of the date
column. It seems like POSIXct
is not allowed here. According to the github documentation of rhandsontable, Date
as in Sys.Date()
is recommended. So replacing
date.range <- as.POSIXct((seq(start.date,end.date,by="day")), origin = "1970-01-01")
with
date.range <- as.Date((seq(start.date,end.date,by="day")), origin = "1970-01-01")
solves this issue. The warning
Warning: Error in as: no method or default for coercing “character” to “NA”
created by the call to hot_to_r
should be gone now.
Updating both tables at once
In order to make all changes in table1
affect table2
and vice versa, you can use the same reactive value to store the tables on the server side.
Here is a full working solution.
library(shiny)
library(rhandsontable)
channel <- c("TV","Radio","Digital")
start.date <- as.Date("2017-01-01")
end.date <- as.Date("2017-01-07")
date.range <- as.Date((seq(start.date,end.date,by="day")), origin = "1970-01-01")
date.range <- as.data.frame(date.range)
colnames(date.range) <- c("date")
date.range[channel] <- 0
table1 <- date.range
table2 <- date.range
#Define the tables.
ui <- fluidPage(
br(),
fluidRow(
column(4, rHandsontableOutput("table1output")),
column(4, rHandsontableOutput("table2output"))
))
server <- function(input,output,session){
table <- reactiveValues()
table$table1 <- table1
#DEFINE ONLY TABLE1
output$table1output <- renderRHandsontable({rhandsontable(table$table1)})
output$table2output <- renderRHandsontable({rhandsontable(table$table1)})
#rhandsontable outputs
observeEvent(input$table1output,{
df <- hot_to_r(input$table1output)
df <- as.data.frame(df)
table$table1 <- df
}, ignoreInit = TRUE, ignoreNULL = TRUE
)
#if a user updates table1 table2 should also update.
observeEvent(input$table2output,{
df <- hot_to_r(input$table2output)
df <- as.data.frame(df)
table$table1 <- df
}, ignoreInit = TRUE, ignoreNULL = TRUE
)
#if a user updates table2 table1 should also update.
}
shinyApp(ui = ui, server = server)
来源:https://stackoverflow.com/questions/44812595/r-shiny-updating-rhandsontable-from-another-rhandsontable