R 列名称中的破折号表示“;“未找到对象”;错误

R 列名称中的破折号表示“;“未找到对象”;错误,r,dataframe,ggplot2,aesthetics,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() } 似乎正在解析基因变量(“H2-Aa”变为H2-Aa)。我怎样才能避开这件事?是否有方法

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

library(ggplot2)

plot_gene <- function (df, gene) {
   ggplot(df, aes(x, y)) + 
     geom_point(aes_string(col = gene)) +
     scale_color_gradient()
}
似乎正在解析
基因
变量(
“H2-Aa”
变为
H2-Aa
)。我怎样才能避开这件事?是否有方法指示字符串不应在
aes_string
中通过
eval

可复制输入 如果您需要一些输入来处理,则会像我的数据一样失败:

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

df通常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\u q
instread

geom_point(aes_q(col = as.name(gene)))
最新版本的
ggplot
支持通过
转义
而不是使用
aes\u string
aes\u q
,这样您就可以

geom_point(aes(col = !!rlang::sym(gene)))

即使是像
colnames(test)这样的命令,您也可以将它们设置为您想要的任何值,但是当通过
read.table
导入数据时,它们会被正确重命名(除非您禁用)。我们应该仔细考虑非标准列名是否真的值得所有额外的麻烦。我确实使用了<代码>阅读>表>代码>,没有其他参数比<代码>标题=真< /代码>。它没有像你建议的那样清理我的列名。哇。我发现这非常令人惊讶。您确定没有设置
check.names=FALSE
或以其他方式重命名它们吗?如果我运行
read.table(text=“a-b,c\n1,2”,header=T,sep=“,”)
我看到
-
变成了
以下是我导入数据的步骤:

geom_point(aes(col = !!rlang::sym(gene)))