在Shiny中通过编程在ggplot中使用列名(替代弃用的aes_)
问题解决:Shiny中ggplot直方图的tidy evaluation替代方案
错误原因
你当前的实现错误在于对enquo()的误用:enquo()的作用是捕获代码表达式(比如未加引号的变量名),而不是字符串。你把字符串类型的列名传给enquo(),导致ggplot最终拿到的是字符串本身,而非对应的数据列,因此触发“x需为连续型”的错误。
两种正确的替代方案
方案1:使用.data代词(推荐,更简洁)
ggplot和tidyverse推荐用.data代词来引用字符串形式的列名,直接通过双括号索引即可:
# 修正后的代码段 temp <- names(data)[1] # 模拟用户选择的列名 p <- ggplot(data=data, aes(x = .data[[temp]])) + geom_histogram(bins=input$bins)
方案2:字符串转符号后解引用
如果习惯用tidy evaluation的符号操作,可以先用sym()把字符串转换成符号,再用!!解引用注入到aes中:
# 修正后的代码段 temp <- names(data)[1] # 模拟用户选择的列名 x <- sym(temp) p <- ggplot(data=data, aes(x = !!x)) + geom_histogram(bins=input$bins)
完整修正后的server代码
server <- function(input, output) { output$distPlot <- renderPlot({ data <- data.frame(rnorm(100)) names(data) <- "Some random thing" # 修正后的实现(以方案1为例) temp <- names(data)[1] p <- ggplot(data=data, aes(x = .data[[temp]])) + geom_histogram(bins=input$bins) p }) }
内容的提问来源于stack exchange,提问作者Steven Ouellette
相关产品推荐
相关产品推荐

