3

我有一个从数据生成散点图的函数,其中提供了一个参数来选择用于为点着色的列。这是一个简化版本:

library(ggplot2)

plot_gene <- function (df, gene) {
   ggplot(df, aes(x, y)) + 
     geom_point(aes_string(col = gene)) +
     scale_color_gradient()
}

wheredf是一个data.framexy, ,然后是一堆基因名称。这适用于大多数基因名称;然而,有些有破折号,这些失败:

print(plot_gene(df, "Gapdh")) # great!
print(plot_gene(df, "H2-Aa")) # Error: object "H2" not found

看来gene变量正在被解析("H2-Aa"变成H2 - Aa)。我怎样才能解决这个问题?有没有办法表明一个字符串不应该通过evalin aes_string

可重现的输入

如果您需要一些输入来玩,这会像我的数据一样失败:

df <- data.frame(c(1,2), c(2,1), c(1,2), c(2,1))
colnames(df) <- c("x", "y", "Gapdh", "H2-Aa")

对于我的真实数据,我使用read.table(..., header=TRUE)并获取带有破折号的列名,因为原始数据文件有它们。

4

1 回答 1

2

通常,R 会非常努力地确保您的 data.frame 中的列名可以是有效的变量名。在使用使用非标准评估类型语法的函数时,使用非标准列名(那些不是有效的变量名)会导致问题。当专注于使用此类变量名称时,您通常必须将它们包装在反引号中。在正常情况下

ggplot(df, aes(x, y)) + 
  geom_point(aes(col = H2-Aa)) +
  scale_color_gradient()
# Error in FUN(X[[i]], ...) : object 'H2' not found

会返回一个错误但是

ggplot(df, aes(x, y)) + 
  geom_point(aes(col = `H2-Aa`)) +
  scale_color_gradient()

会工作。

如果你真的想要,你可以粘贴反引号

geom_point(aes_string(col = paste0("`", gene, "`")))

或者您可以从一开始就将其视为一个符号并使用aes_qinstread

geom_point(aes_q(col = as.name(gene)))

最新版本的ggplot支持转义 via!!而不是使用aes_stringoraes_q你可以这样做

geom_point(aes(col = !!rlang::sym(gene)))
于 2018-02-06T20:34:25.453 回答