我有一个从数据生成散点图的函数,其中提供了一个参数来选择用于着色点的列。这是一个简化版本:
library(ggplot2)
plot_gene <- function (df, gene) {
ggplot(df, aes(x, y)) +
geom_point(aes_string(col = gene)) +
scale_color_gradient()
}
其中df
是 data.frame ,其中列为x
,y
,然后是一堆基因名称。这适用于大多数基因名称;然而,有些人破折号而且失败了:
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)
并使用破折号获取列名,因为原始数据文件包含它们。
答案 0 :(得分:2)
通常,R会非常努力地确保data.frame中的列名可以是有效的变量名。使用非标准列名称(那些不是有效变量名称)将导致使用使用非标准评估类型语法的函数时出现问题。当专注于使用这样的变量名称时,您经常需要将它们包装在后面的刻度中。如果你真的想要
,你可以粘贴反引号geom_point(aes_string(col = paste0("`", gene, "`")))
或者您可以从一开始就将其视为符号并使用aes_q
instread
geom_point(aes_q(col = as.name(gene)))