使用方法("select_")时出错:对于类"NULL"的对象,没有可适用的方法。

4

将这个 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])
```

1
没有一些能够重现问题的数据很难确定,但根据错误信息来看,counts.all 很可能是 NULL(虽然使用 cbind 会导致 select 出现其他问题)。为了排除故障,在创建该对象后,可以返回类似于 head(counts.all) 的内容,并在弄清楚问题所在时注释掉 dplyr::select 行。 - aosmith
我用dplyr::bind_cols命令替换了cbind命令(请参见更新)。谢谢你的帮助! - Carmen Sandoval
编辑:我已经更换了命令,但是在编织时仍然出现错误。 - Carmen Sandoval
如果counts.all不存在,那么可能count.table没有正确传入。请逐个检查每个代码块,即在每个代码块之后检查count.table的内容,看看能否找出为什么没有生成counts.all的原因。确保在一个干净的R会话中进行测试,不要加载任何已有的对象。 - aosmith
2
@marc_aragones:这是_Rmarkdown_,不是Markdown。请不要更改它。 - Hong Ooi
显示剩余3条评论
2个回答

0
我刚意识到这篇帖子已经很旧了,不过,我还是想加上我的想法:
由于我们无法访问数据,所以有点难以跟进。你能否尝试使用这个可复现的示例?我在每个语句的末尾添加了print(),这样你可以快速查看结果。
我认为一些数据并没有按预期传递过来,请根据我在这里做出的数据结构假设检查结果,看看我们两个输出的差异在哪里。
library(tidyverse)

count.tables <- 
  list(
    SF10281 = head(mpg) |> select(SF10281 = cty),
    SF10282 = head(mpg) |> select(SF10282 = cty),
    SF10345 = head(mpg) |> select(SF10345 = cty),
    SF10360 = head(mpg) |> select(SF10360 = cty)
  ) |> 
  print()

counts.all <- # can also just use this purrr::map_dfc(count.tables, bind_cols)
  bind_cols(
    count.tables$SF10281,
    count.tables$SF10282,
    count.tables$SF10345,
    count.tables$SF10360
  ) |> 
  print()

meta <- 
  tibble(
    ID = names(counts.all),
    `Live-dead_call` = rep("1g", 4),
    Genes_tagged = c(400, 800, 1200, 1600)
  ) |> 
  janitor::clean_names() |>  # so everything is snake_case and lower case
  print()

meta.select <- 
  meta |>
  filter(
    str_detect(live_dead_call, "^1g"),
    genes_tagged > 1000
  ) |> 
  print()
  

counts.select <- 
  counts.all |> 
  select(one_of(meta.select$id)) |>
  print()

0
这是我们在处理大型复杂数据集时经常遇到的一个常见错误,所以这个问题值得找到一个通用的解决方案。
一般来说,像这样的错误信息:
UseMethod("select_")中的错误:对类为"NULL"的对象应用'select_'时没有可适用的方法
告诉你其中一个选择条件返回了一个空集。
一个有用的故障排除方法是测试每个选择命令,以查看它返回的内容。对于这个例子,创建临时调试变量:
tempvar1 <- count.tables[["SF10281"]]
tempvar2 <- count.tables[["SF10282"]]

我怀疑这两个都是空的。
一般来说,这些问题可能有两个来源:
1. 源数据文件可能存在损坏或空白字符 - 使用tidyverse的read_table()函数进行一些额外的清理。 2. "SF10281"和"SF10282"可能不被识别为数据结构的顶层名称 - 可以通过运行names(count.tables)来查看名称列表进行检查。如果缺失,则源文件可能具有不同的名称或位于不同的目录中。
事实上,knitter假设一个不同的工作目录 - 所以请确保knitter从您打算的子目录中读取。参见:使用knitr::opts_knit设置工作目录 希望这些提示能帮助其他遇到类似错误信息的人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接