将这个 R Markdown 转换成 HTML 文件时,我遇到了一个奇怪的错误。我认为这与 dplyr 包与 knitr 不兼容有关。
更新:根据下面某人的建议,我用 dplyr::bind_cols 命令替换了 cbind 的块。然而,现在我遇到了另一个同样难以理解的错误:
library(dplyr)
counts.all <- bind_cols(count.tables[["SF10281"]], count.tables[["SF10282"]])
更改后的错误(仅在编织时):
Error in eval(expr, envir, enclos) : not compatible with STRSXP
Calls: <Anonymous> ... withVisible -> eval -> eval -> bind_cols -> cbind_all -> .Call
之前使用 cbind
而不是 dplyr::bind_cols
出现了错误:
分别运行这些代码块没有问题,直到我添加了最后一个代码块(使用 dplyr
中的 select
)。
这是我得到的错误信息:
Quitting from lines 75-77 (Analysis_SF10281_SF10282_Sep29_2015.Rmd)
Error in UseMethod("select_") :
no applicable method for 'select_' applied to an object of class "NULL"
Calls: <Anonymous> ... withVisible -> eval -> eval -> <Anonymous> -> select_
这是完整的Rmd文件:
将基因计数表读入单个数据框列表中(每个样本一个数据框):
```{r}
count.files <- list.files(pattern = "^SF[0-9]+_counts.txt$")
count.tables <- lapply(count.files, read.table, header=T, row.names=1)
names(count.tables) <- gsub("\\_counts.txt", "", count.files)
```
删除基因元数据列:
```{r}
count.tables <- lapply(count.tables, `[`, -(1:5))
```
将单元格(列)重命名为简短版本:
```{r}
count.tables <- lapply(count.tables, function(x) {names(x) <- gsub("X.diazlab.aaron.tophat_out.SF[0-9]+.Sample_(SF[0-9]+).[0-9]+.([A-Z][0-9]+).accepted_hits.bam", "\\1-\\2", names(x)); x})
```
将对象保存到文件以备后用:
{r}
saveRDS(count.tables, file="gliomaRawCounts_10281_10282_10345_10360.rds")
创建一个包含所有4个样本(384个细胞)的单个数据框,并写入文本文件:
```{r}
counts.all <- cbind(count.tables[["SF10281"]], count.tables[["SF10282"]], count.tables[["SF10345"]], count.tables[["SF10360"]])
write.table(counts.all, file="gliomaRawCounts_10281_10282_10345_10360.txt", sep="\t", quote=F, col.names=NA)
```
读取元数据。 为了与dplyr兼容,请不要将单元格ID列分配为行名称。
```{r}
meta <- read.delim("QC_metrics_SCell_SF10281_SF10282_SF10345_SF10360.txt", check.names = F, stringsAsFactors = F)
```
根据活/死/多细胞筛选细胞。 排除空白、仅红色和多细胞孔口:
```{r, results='hide', message=FALSE, warning=FALSE}
library(dplyr)
meta.select <- filter(meta, grepl("^1g", `Live-dead_call`))
```
根据 1,000 基因阈值筛选细胞:
(Includes 12 'FAIL' cells)
```{r}
meta.select <- filter(meta.select, Genes_tagged > 1000)
```
将子集计数表限制为仅包括通过质控的细胞。
```{r}
counts.select <- dplyr::select(counts.all, one_of(meta.select$ID))
head(counts.select[,1:10])
```
counts.all
很可能是NULL
(虽然使用cbind
会导致select
出现其他问题)。为了排除故障,在创建该对象后,可以返回类似于head(counts.all)
的内容,并在弄清楚问题所在时注释掉dplyr::select
行。 - aosmithdplyr::bind_cols
命令替换了cbind
命令(请参见更新)。谢谢你的帮助! - Carmen Sandovalcounts.all
不存在,那么可能count.table
没有正确传入。请逐个检查每个代码块,即在每个代码块之后检查count.table
的内容,看看能否找出为什么没有生成counts.all
的原因。确保在一个干净的R会话中进行测试,不要加载任何已有的对象。 - aosmith