首页 > 解决方案 > “无效的参数类型”通过函数的参数传递 html 颜色

问题描述

功能是:

violin_rating_by_time <- function(df,var,color,title){
        
        label <- df %>%
                filter(!is.na(Decade))%>%
                filter(!is.na(!!as.name(var)))%>%
                mutate(Decade = fct_reorder(factor(Decade),Release.Date))%>%
                group_by(Decade)%>%
                summarise(temp=median(!!as.name(var)))
        
        names(label)[names(label)=="temp"] <- var
        
        plot <- df %>%
                filter(!is.na(Decade))%>%
                mutate(Decade = fct_reorder(factor(Decade),Release.Date))%>%
                ggplot(aes(x=Decade,y=!!as.name(var)))+
                geom_violin(color=!!as.character(color),fill=!!as.character(color),position="dodge",outlier.colour="transparent",alpha = 0.4,draw_quantiles = c(0.5))+
                geom_label(data = label, aes(label = !!as.name(var)),color=!!as.character(color),vjust=-0.4,hjust=0.9)+
                theme_aes()+ 
                theme(legend.position = "NA")  + 
                ggtitle(title)
        
        return(plot)
}

我将参数传递给函数(df 只是我使用的数据框,不太重要。)

violin_rt <- violin_rating_by_time(df=df
                                   ,var="Metacritic.Score"
                                   ,color="#EDDDD4"
                                   ,title="Distribution of MC Scores by Decade")

我收到以下错误消息

!as.character(color) 中的错误:无效的参数类型

它来自 geom_violin 函数。当我在没有颜色的情况下绘图时,它工作正常。

谢谢!

编辑:theme_aes() 是我在 ggplot 中用于一些基本主题参数的函数。它不会导致错误。

标签: rggplot2

解决方案


不需要!!or {{。首先,color已经是作为字符串传递的颜色代码。所以你可以简单地将它传递给colorand/orfill参数geom_violin。此外,!!只能在 quasiquotation 上下文中工作,例如在dplyr管道内:

library(dplyr)
dd <- data.frame(x = 1)

foo <- "foo"

## This works
dd %>% 
  mutate(y = !!as.character(foo))
#>   x   y
#> 1 1 foo

## This does not work
dd$z <- !!as.character(foo)
#> Error in !as.character(foo): invalid argument type

其次,当您将列名作为字符串传递时,您可以通过代词访问dplyr管道内部或内部的列,这也是推荐的方式。请参阅使用 dplyr进行编程和使用 ggplot2 进行编程的最佳实践aes().data

利用@JonSpring 提供的示例数据:

violin_rating_by_time <- function(df, var, color, title) {
  label <- df %>%
    filter(!is.na(Decade)) %>%
    filter(!is.na(.data[[var]])) %>%
    mutate(Decade = fct_reorder(factor(Decade), Release.Date)) %>%
    group_by(Decade) %>%
    summarise(temp = median(.data[[var]]))

  names(label)[names(label) == "temp"] <- var

  df %>%
    filter(!is.na(Decade)) %>%
    mutate(Decade = fct_reorder(factor(Decade), Release.Date)) %>%
    ggplot(aes(x = Decade, y = .data[[var]])) +
    geom_violin(color = color, fill = color, position = "dodge", outlier.colour = "transparent", alpha = 0.4, draw_quantiles = c(0.5)) +
    geom_label(data = label, aes(label = .data[[var]]), color = color, vjust = -0.4, hjust = 0.9) +
    #theme_aes() +
    theme(legend.position = "NA") +
    ggtitle(title)

}

library(ggplot2)
library(dplyr)
library(forcats)

set.seed(42)

df <- data.frame(Decade = 2000,
                 Metacritic.Score = rnorm(10, 10),
                 Release.Date = 2005)

violin_rating_by_time(
  df = df,
  var = "Metacritic.Score",
  color = "#EDDDD4",
  title = "Distribution of MC Scores by Decade"
)
#> Warning: Ignoring unknown parameters: outlier.colour


推荐阅读