r shiny:从另一个 rhandsontable 更新 rhandsontable
Posted
技术标签:
【中文标题】r shiny:从另一个 rhandsontable 更新 rhandsontable【英文标题】:r shiny: updating rhandsontable from another rhandsontable 【发布时间】:2017-12-02 09:57:22 【问题描述】:我希望你一切都好。我正在尝试创建一个闪亮的仪表板,使用户能够从另一个更新一个 rhandsontable。我的代码如下:
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)
每当我运行代码时,我都会收到以下错误:
Warning: Error in as: no method or default for coercing “character” to “NA”
我这辈子都做不到!任何帮助将不胜感激!
干杯,
哈利
【问题讨论】:
看来日期是问题所在。如果我用其他表格替换表格,一切对我来说都很好。看看如何在rhandsontable
中使用日期列。根据this source,Date
如Sys.Date()
是允许的格式。
【参考方案1】:
rhandsontable 中允许的日期格式
第一个问题是date
列的格式。似乎这里不允许使用 POSIXct
。根据the github documentation of rhandsontable,推荐Date
如Sys.Date()
。所以替换
date.range <- as.POSIXct((seq(start.date,end.date,by="day")), origin = "1970-01-01")
与
date.range <- as.Date((seq(start.date,end.date,by="day")), origin = "1970-01-01")
解决了这个问题。警告
警告:错误为:没有将“字符”强制为“NA”的方法或默认值
由对hot_to_r
的调用创建的现在应该消失了。
同时更新两个表
为了使table1
中的所有更改影响table2
,反之亦然,您可以使用相同的反应值将表存储在服务器端。
这是一个完整的工作解决方案。
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)
【讨论】:
非常感谢格雷戈尔!这非常有效!这么简单的错误!感谢您提供的示例也只有一个反应值! 不客气。如果这解决了您的问题,请接受答案。以上是关于r shiny:从另一个 rhandsontable 更新 rhandsontable的主要内容,如果未能解决你的问题,请参考以下文章
R + Shiny 哪个锤子?直的 Shiny、flexdashboard 还是 shinydashboard? [关闭]