Shiny中renderPlot高度随用户输入动态调整报错:object 'x' not found
解决renderPlot动态高度报错"object 'x' not found"的问题
我来帮你拆解下这个错误的根源:你在renderPlot的内部代码块里定义了变量x,但height参数对应的匿名函数是在完全不同的作用域里运行的,它根本访问不到你在renderPlot内部定义的x,所以才会抛出"object 'x' not found"的错误。
下面给你两种可行的解决方案:
方案1:直接在height函数内计算高度因子
把计算x的逻辑移到height的匿名函数里,这样就不用依赖renderPlot内部的变量了,代码修改如下:
server <- function(input, output, session) { dat5<-reactive({ D5 %>% filter(Parameter==input$analyte)}) output$plot1 <- renderPlot({ if (input$graph=='By subject') { p<-ggplot(dat5(), aes(x=TALD.hr, y=Value, col=Parameter)) + geom_line(aes(group = Parameter),lwd=0.9,show.legend = F) + facet_wrap(as.formula(~Label),ncol=3)+ guides(shape=FALSE, colour=FALSE) } else { # 必须补充else分支的绘图逻辑,否则当input$graph不是"By subject"时p会未定义 p <- ggplot(dat5(), aes(x=Cycle2, y=Value, col=Parameter)) + geom_point() + # 这里替换成你需要的图层 facet_wrap(as.formula(~Cycle2),ncol=3) # 根据实际需求调整 } print(p) }, height = function() { # 直接在这里计算高度对应的因子x x <- ifelse(input$graph=='By subject', length(unique(D5$Label)), length(unique(D5$Cycle2))) x * 100 }, width = 800) }
方案2:用reactive变量共享高度因子
如果这个高度因子在其他地方也需要用到,可以把它定义成一个reactive变量,这样renderPlot内部和height函数都能访问到:
server <- function(input, output, session) { dat5<-reactive({ D5 %>% filter(Parameter==input$analyte)}) # 把高度因子定义为reactive变量 plot_height_factor <- reactive({ ifelse(input$graph=='By subject', length(unique(D5$Label)), length(unique(D5$Cycle2))) }) output$plot1 <- renderPlot({ if (input$graph=='By subject') { p<-ggplot(dat5(), aes(x=TALD.hr, y=Value, col=Parameter)) + geom_line(aes(group = Parameter),lwd=0.9,show.legend = F) + facet_wrap(as.formula(~Label),ncol=3)+ guides(shape=FALSE, colour=FALSE) } else { # 同样要补充else分支的绘图代码 p <- ggplot(dat5(), aes(x=Cycle2, y=Value, col=Parameter)) + geom_boxplot() # 替换为你的实际图层 } print(p) }, height = function() { plot_height_factor() * 100 }, width = 800) }
额外提醒
- 一定要补充
else分支的绘图逻辑,否则当用户选择非"By subject"的graph选项时,变量p会未定义,导致新的报错。 - 如果
D5是一个reactive数据源(比如你用reactive()定义的),那访问它的时候要写成D5()而不是直接用D5,否则会获取不到最新的数据。
内容的提问来源于stack exchange,提问作者alma123
相关产品推荐
相关产品推荐

