4

当我做:

> quo(DLX6-AS1) 

输出是:

<quosure>
expr: ^DLX6 - AS1
env:  global

在破折号周围插入空格。

当我尝试将其转换为字符串时,我得到:

quo(DLX6-AS1) %>% quo_name

"DLX6 - AS1"

或者

quo(DLX6-AS1) %>% rlang::quo_name

或者

quo(`DLX6-AS1`) %>% rlang::quo_name

Error: Can't convert a call to a string

如何在我的函数中使用带有破折号的字符串?该函数接受一个基因名称并在数据框中查找该行,但一些基因由破折号连接:

geneFn <- function(exp.df = seurat.object@data, gene = SOX2) {

    gene <- enquo(gene)

    exp.df <- exp.df[as_name(gene), ] 

}

> geneFn(DLX6-AS1)

谢谢!

之前已经问过这个问题:https ://github.com/r-lib/rlang/issues/770 ,但它没有回答如何实际执行此操作。

4

3 回答 3

2

你有什么版本的rlang?对我来说,这有效:

quo(`DLX6-AS1`) %>% quo_name()
#> [1] "DLX6-AS1"

当列名包含特殊字符时,您确实需要使用反引号,否则它们将被解释为代码。

请注意,建议使用as_name()as_label()代替quo_name(),后者是一种误导性的误称,将来可能会被弃用。

于 2019-09-11T06:27:14.443 回答
1

一种选择是坚持使用裸行名称,但将语法上无效的名称(如带有破折号的名称)包装在反引号中。如果其他人应该使用此功能,这可能会令人困惑。

这是一个可重复的小示例:

library(rlang)

dat = data.frame(x1 = letters[1:2],
                 x2 = LETTERS[1:2])
row.names(dat) = c("DLX6-AS1", "other")

geneFn <- function(exp.df = dat, gene = other) {

    gene <- enquo(gene)

    exp.df[as_name(gene), ] 

}

geneFn(gene = other)
#       x1 x2
# other  b  B
geneFn(gene = `DLX6-AS1`)
#          x1 x2
# DLX6-AS1  a  A

如果您有很多这样的名称,则传递带引号的名称而不是裸名称可能更简单。这也稍微简化了功能,因为您不需要 tidyeval。

geneFn2 <- function(exp.df = dat, gene = "other") {

    exp.df[gene, ] 

}

geneFn2(gene = "other")
#       x1 x2
# other  b  B
geneFn2(gene = "DLX6-AS1")
#          x1 x2
# DLX6-AS1  a  A

另一种选择是使语法上有效的名称行名称。该make.names()功能可以帮助解决这个问题。

make.names( row.names(dat) )
[1] "DLX6.AS1" "other"  

然后,您可以分配这些新的行名称来替换旧的并使用新名称继续您的原始函数。

row.names(dat) = make.names( row.names(dat) )
于 2019-09-10T23:23:18.407 回答
0

关于什么:

geneFn <- function(exp.df = seurat.object@data, gene = SOX2) {
    gene <- sub(" - ","-", deparse(enexpr(gene)))
    exp.df <- exp.df[gene, ] 
}
于 2019-09-12T21:43:56.073 回答