R 反应元素:在通用 id 中使用 "i"(for i in 1:8)
R reactive elements: use "i" (for i in 1:8) in generic id
我有一个包含多个图表的 flexdashboard,我想添加一个带有工具提示的悬停功能,显示其中 8 个图表的数据。
为了避免复制整个 hoveroptions + tooltip 代码 8 次,我使用循环创建具有不同名称 (1-8) 的 hoveroptions 8x(相同选项的 8 倍)并转动工具提示(renderUI)进入带有参数 "data" 和 "i".
的函数
我需要具有不同名称的相同悬停选项,因为如果我只使用一个悬停选项,当我将鼠标悬停在图 2 上时,图 1 将显示工具提示,这显然是我不想要的。我所有的图表都使用同一数据集的一部分,但在同一位置显示不同的变量。例如,图 1 显示变量 Wtot,而图 2 显示变量 Mtot,它位于同一 plant/row 坐标上。
我的工具提示代码有问题:如何编写 hoverOpts
id 的通用版本? ID 为 plot_hover1、plot_hover2 等。使用 paste("input$plot_hover",i,sep="")
无效。它创建了一个字符串,看起来和id一模一样,但显然没有相同的含义。
代码(1 个绘图示例)
---
title: "Test"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(ggplot2)
# data
Wtot <- c(10,65,139,87)
plant <- c(15,15,30,30)
row <- c(10,20,10,20)
df <- data.frame(Wtot,plant,row)
# hover options x8
HO <- list(NULL)
for (i in 1:8){
HO[[i]] <- hoverOpts(id = paste("plot_hover",i,sep=""), delay = 300,
delayType = c("debounce", "throttle"), clip = TRUE, nullOutside = TRUE)
}
# plot function
Wplot <- function(dat,i){
renderPlot({
ggplot(data=dat, aes(row, plant, colour=Wtot)) +
xlim(0,40) +
ylim(0,50) +
coord_equal() +
geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +
scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey",
limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +
scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +
guides(fill=guide_legend(), size = guide_legend())
}, outputArgs = list(hover = HO[[i]])) # <-- i works
}
# tooltip function
tooltip <- function(dat,i){
renderUI({
hover <- input$plot_hover1 # <-- problem with id, "1" should be "i"
point <- nearPoints(dat, hover)
if (nrow(point) == 0) return(NULL)
left_pct <- (hover$x - hover$domain$left) / (hover$domain$right - hover$domain$left)
top_pct <- (hover$domain$top - hover$y) / (hover$domain$top - hover$domain$bottom)
left_px <- hover$range$left + left_pct * (hover$range$right - hover$range$left)
top_px <- hover$range$top + top_pct * (hover$range$bottom - hover$range$top)
style <- paste0("position:absolute; z-index:100; background-color: rgba(245, 245, 245, 0.85);",
"left:", left_px + 30, "px; top:", top_px + 2, "px;")
wellPanel(
style = style,
p(HTML(paste0("<b> nr: </b>", rownames(point), "<br/>",
"<b> Wtot: </b>", point$Wtot, "<br/>"))))
})
}
```
```{r}
# plot 1 with tooltip
Wplot(df,1)
tooltip(df,1)
```
我想你可以使用 hover <- eval(parse(text = paste0("input$plot_hover", i)))
。
意思是你解析字符然后评估它,就好像你是 运行 命令一样。
再试一次。你的例子测试起来很奇怪,因为所有的图都是一样的,最初你只绘制了第一个图,但你不能用它来测试其他图。我绘制了前两个图 side-by-side,但没有费心让两个图不同 - 我相信你可以做到。
---
title: "Test"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(ggplot2)
# data
Wtot <- c(10,65,139,87)
plant <- c(15,15,30,30)
row <- c(10,20,10,20)
df <- data.frame(Wtot,plant,row)
# hover options x8
HO <- list(NULL)
for (i in 1:8){
HO[[i]] <- hoverOpts(id = paste("plot_hover",i,sep=""), delay = 300,
delayType = c("debounce", "throttle"), clip = TRUE, nullOutside = TRUE)
}
# plot function
Wplot <- function(dat,i){
renderPlot({
ggplot(data=dat, aes(row, plant, colour=Wtot)) +
xlim(0,40) +
ylim(0,50) +
coord_equal() +
geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +
scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey",
limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +
scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +
guides(fill=guide_legend(), size = guide_legend())
}, outputArgs = list(hover = HO[[i]])) # <-- i works
}
# tooltip function
tooltip <- function(dat,i){
renderUI({
hover <- eval(parse(text = paste0("input$plot_hover", i))) # <-- problem with id, "1" should be "i"
# hover <- input$plot_hover1
point <- nearPoints(dat, hover)
if (nrow(point) == 0) return(NULL)
left_pct <- (hover$x - hover$domain$left) / (hover$domain$right - hover$domain$left)
top_pct <- (hover$domain$top - hover$y) / (hover$domain$top - hover$domain$bottom)
left_px <- hover$range$left + left_pct * (hover$range$right - hover$range$left)
top_px <- hover$range$top + top_pct * (hover$range$bottom - hover$range$top)
style <- paste0("position:absolute; z-index:100; background-color: rgba(245, 245, 245, 0.85);",
"left:", left_px + 30, "px; top:", top_px + 2, "px;")
wellPanel(
style = style,
p(HTML(paste0("<b> nr: </b>", rownames(point), "<br/>",
"<b> Wtot: </b>", point$Wtot, "<br/>"))))
})
}
```
##
### Plot 1
```{r}
# plot 1 with tooltip
Wplot(df,1)
tooltip(df,1)
```
##
### Plot 2
```{r}
# plot 1 with tooltip
Wplot(df,2)
tooltip(df,2)
```
我有一个包含多个图表的 flexdashboard,我想添加一个带有工具提示的悬停功能,显示其中 8 个图表的数据。
为了避免复制整个 hoveroptions + tooltip 代码 8 次,我使用循环创建具有不同名称 (1-8) 的 hoveroptions 8x(相同选项的 8 倍)并转动工具提示(renderUI)进入带有参数 "data" 和 "i".
的函数我需要具有不同名称的相同悬停选项,因为如果我只使用一个悬停选项,当我将鼠标悬停在图 2 上时,图 1 将显示工具提示,这显然是我不想要的。我所有的图表都使用同一数据集的一部分,但在同一位置显示不同的变量。例如,图 1 显示变量 Wtot,而图 2 显示变量 Mtot,它位于同一 plant/row 坐标上。
我的工具提示代码有问题:如何编写 hoverOpts
id 的通用版本? ID 为 plot_hover1、plot_hover2 等。使用 paste("input$plot_hover",i,sep="")
无效。它创建了一个字符串,看起来和id一模一样,但显然没有相同的含义。
代码(1 个绘图示例)
---
title: "Test"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(ggplot2)
# data
Wtot <- c(10,65,139,87)
plant <- c(15,15,30,30)
row <- c(10,20,10,20)
df <- data.frame(Wtot,plant,row)
# hover options x8
HO <- list(NULL)
for (i in 1:8){
HO[[i]] <- hoverOpts(id = paste("plot_hover",i,sep=""), delay = 300,
delayType = c("debounce", "throttle"), clip = TRUE, nullOutside = TRUE)
}
# plot function
Wplot <- function(dat,i){
renderPlot({
ggplot(data=dat, aes(row, plant, colour=Wtot)) +
xlim(0,40) +
ylim(0,50) +
coord_equal() +
geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +
scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey",
limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +
scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +
guides(fill=guide_legend(), size = guide_legend())
}, outputArgs = list(hover = HO[[i]])) # <-- i works
}
# tooltip function
tooltip <- function(dat,i){
renderUI({
hover <- input$plot_hover1 # <-- problem with id, "1" should be "i"
point <- nearPoints(dat, hover)
if (nrow(point) == 0) return(NULL)
left_pct <- (hover$x - hover$domain$left) / (hover$domain$right - hover$domain$left)
top_pct <- (hover$domain$top - hover$y) / (hover$domain$top - hover$domain$bottom)
left_px <- hover$range$left + left_pct * (hover$range$right - hover$range$left)
top_px <- hover$range$top + top_pct * (hover$range$bottom - hover$range$top)
style <- paste0("position:absolute; z-index:100; background-color: rgba(245, 245, 245, 0.85);",
"left:", left_px + 30, "px; top:", top_px + 2, "px;")
wellPanel(
style = style,
p(HTML(paste0("<b> nr: </b>", rownames(point), "<br/>",
"<b> Wtot: </b>", point$Wtot, "<br/>"))))
})
}
```
```{r}
# plot 1 with tooltip
Wplot(df,1)
tooltip(df,1)
```
我想你可以使用 hover <- eval(parse(text = paste0("input$plot_hover", i)))
。
意思是你解析字符然后评估它,就好像你是 运行 命令一样。
再试一次。你的例子测试起来很奇怪,因为所有的图都是一样的,最初你只绘制了第一个图,但你不能用它来测试其他图。我绘制了前两个图 side-by-side,但没有费心让两个图不同 - 我相信你可以做到。
---
title: "Test"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(ggplot2)
# data
Wtot <- c(10,65,139,87)
plant <- c(15,15,30,30)
row <- c(10,20,10,20)
df <- data.frame(Wtot,plant,row)
# hover options x8
HO <- list(NULL)
for (i in 1:8){
HO[[i]] <- hoverOpts(id = paste("plot_hover",i,sep=""), delay = 300,
delayType = c("debounce", "throttle"), clip = TRUE, nullOutside = TRUE)
}
# plot function
Wplot <- function(dat,i){
renderPlot({
ggplot(data=dat, aes(row, plant, colour=Wtot)) +
xlim(0,40) +
ylim(0,50) +
coord_equal() +
geom_point(aes(fill=Wtot, size=Wtot), colour="black", pch=22) +
scale_fill_gradient2(low="green", mid="yellow", high="red", na.value="grey",
limits=c(0,300), midpoint=150, breaks=c(0,75,150,225,300)) +
scale_size_continuous(range=c(3,6), limits=c(0,300), breaks=c(0,75,150,225,300)) +
guides(fill=guide_legend(), size = guide_legend())
}, outputArgs = list(hover = HO[[i]])) # <-- i works
}
# tooltip function
tooltip <- function(dat,i){
renderUI({
hover <- eval(parse(text = paste0("input$plot_hover", i))) # <-- problem with id, "1" should be "i"
# hover <- input$plot_hover1
point <- nearPoints(dat, hover)
if (nrow(point) == 0) return(NULL)
left_pct <- (hover$x - hover$domain$left) / (hover$domain$right - hover$domain$left)
top_pct <- (hover$domain$top - hover$y) / (hover$domain$top - hover$domain$bottom)
left_px <- hover$range$left + left_pct * (hover$range$right - hover$range$left)
top_px <- hover$range$top + top_pct * (hover$range$bottom - hover$range$top)
style <- paste0("position:absolute; z-index:100; background-color: rgba(245, 245, 245, 0.85);",
"left:", left_px + 30, "px; top:", top_px + 2, "px;")
wellPanel(
style = style,
p(HTML(paste0("<b> nr: </b>", rownames(point), "<br/>",
"<b> Wtot: </b>", point$Wtot, "<br/>"))))
})
}
```
##
### Plot 1
```{r}
# plot 1 with tooltip
Wplot(df,1)
tooltip(df,1)
```
##
### Plot 2
```{r}
# plot 1 with tooltip
Wplot(df,2)
tooltip(df,2)
```