rhandsontable & shiny:根据添加的列制作条件图
rhandsontable & shiny: make a conditional plot depending on added columns
我想在 shiny 中更新 table 后制作一个绘图 (ggplot),但我似乎无法让它工作 - 绘图没有出现。只有在为 x 和 y 创建列后,该图才会出现。理想情况下,点作为值出现在编辑到 table 中。下面是我扩展的一些可重现代码 ()。
library(rhandsontable)
library(tidyverse)
ui <- fluidPage(
h2("The mtcars data"),
rHandsontableOutput("mytable"),
textInput('NewCol', 'Enter new column name'),
radioButtons("type", "Column type:",
c("Integer" = "integer",
"Floating point" = "numeric",
"Text" = "character")),
actionButton("goButton", "Update Table"),
plotOutput("plot")
)
server <- function(input, output) {
# g <- reactiveValues(d=NULL) #define it ouside
mydata <- mtcars[1:5,]
output$mytable = renderRHandsontable(df())
df <- eventReactive(input$goButton, {
if(input$NewCol!="" && !is.null(input$NewCol) && input$goButton>0){
if (input$type == "integer") v1 <- integer(NROW(mydata))
if (input$type == "numeric") v1 <- numeric(NROW(mydata))
if (input$type == "character") v1 <- character(NROW(mydata))
newcol <- data.frame(v1)
names(newcol) <- input$NewCol
mydata <<- cbind(mydata, newcol)
}
rhandsontable(mydata, stretchH = "all")
}, ignoreNULL = FALSE)
observe(if (!is.null(input$mytable)) mydata <<- hot_to_r(input$mytable))
output$plot <- renderPlot({
if (req(mydata$x) >= 0 & req(mydata$y) >= 0)
ggplot(mydata, aes(x=mydata$x,y=mydata$y)) +
geom_point()
# else if (req(mydata$x) = 0 & req(mydata$y) = 0) {
# print("empty")
# }
})
}
shinyApp(ui,server)
我不确切知道这些函数是如何工作的(rhandsontable
和 hot_to_r
),但你想要做的似乎与经典的 reactiveValues
框架兼容,就像你的服务器代码:
r = reactiveValues(mydata=mtcars[1:5,])
output$mytable = renderRHandsontable(df())
df <- eventReactive(input$goButton, {
if(input$NewCol!="" && !is.null(input$NewCol) && input$goButton>0){
if (input$type == "integer") v1 <- integer(NROW(r$mydata))
if (input$type == "numeric") v1 <- numeric(NROW(r$mydata))
if (input$type == "character") v1 <- character(NROW(r$mydata))
newcol <- data.frame(v1)
names(newcol) <- input$NewCol
r$mydata <- cbind(r$mydata, newcol)
}
rhandsontable(r$mydata, stretchH = "all")
}, ignoreNULL = FALSE)
observe({if (!is.null(input$mytable)) r$mydata <- hot_to_r(input$mytable)})
output$plot <- renderPlot({
if(is.null(r$mydata$x) | is.null(r$mydata$y)) {return(NULL)}
ggplot(r$mydata, aes(x=x,y=y)) +
geom_point()}) }
估计比全局赋值安全,一般不推荐
我想在 shiny 中更新 table 后制作一个绘图 (ggplot),但我似乎无法让它工作 - 绘图没有出现。只有在为 x 和 y 创建列后,该图才会出现。理想情况下,点作为值出现在编辑到 table 中。下面是我扩展的一些可重现代码 (
library(rhandsontable)
library(tidyverse)
ui <- fluidPage(
h2("The mtcars data"),
rHandsontableOutput("mytable"),
textInput('NewCol', 'Enter new column name'),
radioButtons("type", "Column type:",
c("Integer" = "integer",
"Floating point" = "numeric",
"Text" = "character")),
actionButton("goButton", "Update Table"),
plotOutput("plot")
)
server <- function(input, output) {
# g <- reactiveValues(d=NULL) #define it ouside
mydata <- mtcars[1:5,]
output$mytable = renderRHandsontable(df())
df <- eventReactive(input$goButton, {
if(input$NewCol!="" && !is.null(input$NewCol) && input$goButton>0){
if (input$type == "integer") v1 <- integer(NROW(mydata))
if (input$type == "numeric") v1 <- numeric(NROW(mydata))
if (input$type == "character") v1 <- character(NROW(mydata))
newcol <- data.frame(v1)
names(newcol) <- input$NewCol
mydata <<- cbind(mydata, newcol)
}
rhandsontable(mydata, stretchH = "all")
}, ignoreNULL = FALSE)
observe(if (!is.null(input$mytable)) mydata <<- hot_to_r(input$mytable))
output$plot <- renderPlot({
if (req(mydata$x) >= 0 & req(mydata$y) >= 0)
ggplot(mydata, aes(x=mydata$x,y=mydata$y)) +
geom_point()
# else if (req(mydata$x) = 0 & req(mydata$y) = 0) {
# print("empty")
# }
})
}
shinyApp(ui,server)
我不确切知道这些函数是如何工作的(rhandsontable
和 hot_to_r
),但你想要做的似乎与经典的 reactiveValues
框架兼容,就像你的服务器代码:
r = reactiveValues(mydata=mtcars[1:5,])
output$mytable = renderRHandsontable(df())
df <- eventReactive(input$goButton, {
if(input$NewCol!="" && !is.null(input$NewCol) && input$goButton>0){
if (input$type == "integer") v1 <- integer(NROW(r$mydata))
if (input$type == "numeric") v1 <- numeric(NROW(r$mydata))
if (input$type == "character") v1 <- character(NROW(r$mydata))
newcol <- data.frame(v1)
names(newcol) <- input$NewCol
r$mydata <- cbind(r$mydata, newcol)
}
rhandsontable(r$mydata, stretchH = "all")
}, ignoreNULL = FALSE)
observe({if (!is.null(input$mytable)) r$mydata <- hot_to_r(input$mytable)})
output$plot <- renderPlot({
if(is.null(r$mydata$x) | is.null(r$mydata$y)) {return(NULL)}
ggplot(r$mydata, aes(x=x,y=y)) +
geom_point()}) }
估计比全局赋值安全,一般不推荐