【问题标题】:Loop over character vector in R循环R中的字符向量
【发布时间】:2020-04-13 06:30:19
【问题描述】:

我正在尝试构建一个 for() 循环来为数据集中的基因列表绘制和保存 ggplot。 我的初始代码如下:

for(i in genelist){
  plot <- ggplot() +
           geom_density(data = mydata, aes(x=log2(i)), fill="pink", alpha = 0.5) +
           xlab(paste("log2 ", i))
  ggsave(plot, filename = paste("plot_",i ,".png"))
  }

genelist 是一个 chr 向量。

mydata 是一个数据框,其中 colnames 是基因名称,rownames 是患者条形码,matrix 是计数值。

我得到以下错误:

图像节省 11.3 x 5.98 log2(i) 中的错误:数学函数的非数字参数

由于错误似乎来自绘图保存,我尝试了没有代码:

for(i in genelist){
  plot <- ggplot() +
           geom_density(data = mydata, aes(x=log2(i)), fill="pink", alpha = 0.5) +
           xlab(paste("log2 ", i))
   }

循环结束没有错误(i = 我在基因列表中的最后一个基因)但是当我试图显示情节时:

log2(i) 中的错误:数学函数的非数字参数

我做错了什么?

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。但是问题很可能是您尝试在已被女士评估的aes() 中使用i。也许aes(x=log2(.data[[i]])) 会起作用。还要使用paste0() 而不是paste() 以确保您的文件名没有空格。
  • 效果很好,谢谢!你能解释一下 .data[[i]] 的语法吗?在我对 R 的有限了解中,[[ ]] 用于对列表进行子集化。这是否意味着 .data[[i]] 告诉从列表“i”中获取数据,并且由于“i”是对应于 mydata 列的基因名称(数据框列是列表,对吗?)它返回其值?为什么 is 不能仅与 [[i]] 一起使用?
  • .data 是 ggplot 在绘图时为您创建的“神奇”变量。正如您尝试做的那样,它可以更轻松地通过字符值对数据进行子集化。这是一种避免使用!!sym() 方法的方法。

标签: r for-loop plot character


【解决方案1】:

我们可以写一个函数:

library(ggplot2)

plot_save <- function(i) {
    plot <- ggplot() +
             geom_density(data = mydata, aes(x=log2(!!sym(i)), 
                          fill="pink", alpha = 0.5)) +
             xlab(paste("log2 ", i))

    ggsave(plot, filename = paste0("plot_",i ,".png"))
}

并将genelist 传递给函数。

lapply(genelist, plot_save)

【讨论】:

  • 这也很完美,谢谢!同样在这里,你能解释一下 !!sym(i) 语法吗?
  • genelist是一个字符向量,使用sym我们将字符值转换为符号。
猜你喜欢
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多