闪亮应用程序中 for 循环的 ggvis 悬停能力
ggvis hover ability in for loop in shiny app
我正在尝试在闪亮的应用程序中创建数量可变的图,每个图都具有来自 ggvis 的悬停功能,使用 add_tooltip() 来显示实际数据点。为了创建可变数量的图,我使用了 for 循环。请参阅下面的玩具示例,它可以单独 运行。
出于某种原因,在我的代码中,悬停功能仅适用于创建的最终图。有谁知道我可以如何解决这个问题或者有更好的建议吗?
谢谢!
library(shiny)
library(ggvis)
# Define ui for variable amounts of plots
ui <- fluidPage(
fluidRow(
uiOutput("mydisplay")
)
)
server <- function(input, output) {
# toy data example
x = data.frame(
id = 1:30,
myname = c(rep("First 10",10),rep("Second 10",10),rep("Third 10",10)),
stringsAsFactors = F
)
# ggvis add_tooltip() function
all_values <- function(x) {
if(is.null(x)) return(NULL)
row <- mydf[mydf$id == x$id, c("id","myname") ]
paste0(names(row), ": ", format(row), collapse = "<br />")
}
# For loop to create variable number of plots
for (k in 1:length(unique(x$myname))){
mydf = subset(x,x$myname==unique(x$myname)[k])
mydf %>% ggvis(~id, ~id) %>%
layer_points(size := 30, key := ~id) %>%
add_tooltip(all_values,"hover") %>%
bind_shiny(paste0("p_",k), paste0("p_ui_",k))
}
# For displaying in the UI
output$mydisplay = renderUI({
lapply(1:length(unique(x$myname)), function(j) {
fluidRow(
column(7, ggvisOutput(paste0("p_",j)))
)
})
})
}
# Run the application
shinyApp(ui = ui, server = server)
感谢 回答了我自己的问题。 ggvis 代码需要包装在一个 reactive({}) 函数中。希望这对某人有所帮助。
我正在尝试在闪亮的应用程序中创建数量可变的图,每个图都具有来自 ggvis 的悬停功能,使用 add_tooltip() 来显示实际数据点。为了创建可变数量的图,我使用了 for 循环。请参阅下面的玩具示例,它可以单独 运行。
出于某种原因,在我的代码中,悬停功能仅适用于创建的最终图。有谁知道我可以如何解决这个问题或者有更好的建议吗?
谢谢!
library(shiny)
library(ggvis)
# Define ui for variable amounts of plots
ui <- fluidPage(
fluidRow(
uiOutput("mydisplay")
)
)
server <- function(input, output) {
# toy data example
x = data.frame(
id = 1:30,
myname = c(rep("First 10",10),rep("Second 10",10),rep("Third 10",10)),
stringsAsFactors = F
)
# ggvis add_tooltip() function
all_values <- function(x) {
if(is.null(x)) return(NULL)
row <- mydf[mydf$id == x$id, c("id","myname") ]
paste0(names(row), ": ", format(row), collapse = "<br />")
}
# For loop to create variable number of plots
for (k in 1:length(unique(x$myname))){
mydf = subset(x,x$myname==unique(x$myname)[k])
mydf %>% ggvis(~id, ~id) %>%
layer_points(size := 30, key := ~id) %>%
add_tooltip(all_values,"hover") %>%
bind_shiny(paste0("p_",k), paste0("p_ui_",k))
}
# For displaying in the UI
output$mydisplay = renderUI({
lapply(1:length(unique(x$myname)), function(j) {
fluidRow(
column(7, ggvisOutput(paste0("p_",j)))
)
})
})
}
# Run the application
shinyApp(ui = ui, server = server)
感谢