列名称中的短划线会产生"找不到对象"错误

时间:2018-02-06 20:24:13

标签: r dataframe ggplot2 aesthetics

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

library(ggplot2)

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

其中df data.frame ,其中列为xy,然后是一堆基因名称。这适用于大多数基因名称;然而,有些人破折号而且失败了:

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

gene变量似乎已被解析("H2-Aa"变为H2 - Aa)。我怎么能绕过这个?有没有办法表明字符串不应该通过eval中的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)并使用破折号获取列名,因为原始数据文件包含它们。

1 个答案:

答案 0 :(得分:2)

通常,R会非常努力地确保data.frame中的列名可以是有效的变量名。使用非标准列名称(那些不是有效变量名称)将导致使用使用非标准评估类型语法的函数时出现问题。当专注于使用这样的变量名称时,您经常需要将它们包装在后面的刻度中。如果你真的想要

,你可以粘贴反引号
geom_point(aes_string(col = paste0("`", gene, "`")))

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

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