我有一个从数据生成散点图的函数,其中提供了一个参数来选择用于为点着色的列。这是一个简化版本:
library(ggplot2)
plot_gene <- function (df, gene) {
ggplot(df, aes(x, y)) +
geom_point(aes_string(col = gene)) +
scale_color_gradient()
}
哪里
df
是 数据框带列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)
并使用破折号获取列名,因为原始数据文件中有它们。
最佳答案
通常,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_q
插入geom_point(aes_q(col = as.name(gene)))
最新发布
ggplot
支持通过 !!
转义而不是使用 aes_string
或 aes_q
所以你可以这样做geom_point(aes(col = !!rlang::sym(gene)))
关于r - 列名中的破折号产生 "object not found"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48651370/