如何让一个函数在expression()内正常执行?

SCD*_*DCE 4 expression r ggplot2

我正在尝试将一些标签部分斜体化,但仍然具有sum()功能,但我不知道该怎么做:

library(ggplot2)
library(reshape2)

iris_mean <- aggregate(iris[,1:4], by=list(Species=iris$Species), FUN=mean) 
iris_sd <- aggregate(iris[,1:4], by=list(Species=iris$Species), FUN=sd) 
df_mean <- melt(iris_mean, id.vars=c("Species"), variable.name = "Samples", value.name="Values")
df_sd <- melt(iris_sd, id.vars=c("Species"), variable.name = "Samples", value.name="Values")
limits <- aes(ymax = df_mean[,"Values"] + df_sd[,"Values"], ymin=df_mean[,"Values"] - df_sd[,"Values"])
df_mean$Species <- factor(df_mean$Species, levels=unique(df_mean$Species), ordered=TRUE)

ggplot(df_mean, aes(Samples, Values, fill = Species)) + 
  geom_bar(position="dodge", stat="identity") + coord_flip() + 
  theme(axis.text.y=element_text(angle=0, hjust=1)) +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.margin = unit(c(1,1,.5,0),"cm"),
    legend.key.size = unit(.5, "lines"),
    axis.text.y = element_text(face = "italic")
  ) +
  scale_x_discrete("", 
                   labels= expression(
                     paste(italic("I. setosa"), " (n=", sum(iris == "setosa"), ")"),
                     paste(italic("I. versicolor"), " (n=", sum(iris == "versicolor"), ")"),
                     paste(italic("I. virginica"), " (n=", sum(iris == "virginica"), ")")))
Run Code Online (Sandbox Code Playgroud)

当前情节:

当前情节

想要的情节:

想要的情节

MrF*_*ick 5

只需查看scale_x_discrete,您就可以做到

scale_x_discrete("", 
     labels= c(
        bquote(italic("I. setosa")*" (n="*.(sum(iris == "setosa")) * ")"),
        bquote(italic("I. versicolor")*" (n="*.(sum(iris == "versicolor")) * ")"),
        bquote(italic("I. virginica")*" (n="*.(sum(iris == "virginica")) * ")")))
Run Code Online (Sandbox Code Playgroud)

这里我们用来bquote()将值“插入”到表达式中。我们使用调用.()中的函数来执行此操作bquote(),该函数计算当前环境中的表达式并将值插入到表达式中。

您可以使用以下命令自动创建这些内容

x <- c("setosa", "versicolor", "virginica")
xlabels <- lapply(x, function(spec) {
    bquote(italic(.(paste("I.", spec)))*" (n="*.(sum(iris == spec)) * ")")
})
Run Code Online (Sandbox Code Playgroud)

然后使用

+ scale_x_discrete("", labels= xlabels)
Run Code Online (Sandbox Code Playgroud)