是否将带破折号的quosure转换为字符串?

是否将带破折号的quosure转换为字符串?,r,dplyr,rlang,tidyeval,quosure,R,Dplyr,Rlang,Tidyeval,Quosure,当我这样做时: > quo(DLX6-AS1) 输出为: <quosure> expr: ^DLX6 - AS1 env: global 或 或 如何在函数中使用带破折号的字符串?该函数接受一个基因名称并在数据帧中查找该行,但某些基因由破折号连接: geneFn <- function(exp.df = seurat.object@data, gene = SOX2) { gene <- enquo(gene) exp.df <-

当我这样做时:

> quo(DLX6-AS1) 
输出为:

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

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

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

    gene <- enquo(gene)

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

}

> geneFn(DLX6-AS1)

geneFn一个选项是坚持使用裸行名称,但将语法无效的名称(如带破折号的名称)换行。如果其他人应该使用此功能,这可能会令人困惑

下面是一个小的、可复制的示例:

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
然后,您可以指定这些新行名称来替换旧的行名称,并使用新名称继续使用原始函数

row.names(dat) = make.names( row.names(dat) )

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

quo(`DLX6-AS1`) %>% quo_name()
#> [1] "DLX6-AS1"
当列名具有特殊字符时,确实需要使用反勾号,否则它们将被解释为代码

请注意,建议使用
作为\u name()
作为\u label()
而不是
quo\u name()
,后者是一个误导性的误称,将来可能会被弃用。

关于:

geneFn <- function(exp.df = seurat.object@data, gene = SOX2) {
    gene <- sub(" - ","-", deparse(enexpr(gene)))
    exp.df <- exp.df[gene, ] 
}

geneFn可能是背虱子?比如
rlang::quo(`DLX6-AS1`)
quo_name()
结果在我看来更好,但如果没有一点数据reprex,我无法在您的函数中测试它。如果您不想传递带有反勾号的裸名称,另一个选项是切换到使用带引号的名称,而不是裸名称。然后您可以一起跳过tidyeval,直接使用gene参数来提取行:
gene=“SOX2”
Then
exp.df[gene,]
在函数中。您可以共享一些数据以便我们测试我们的解决方案吗。我分享的关于这个问题的链接实际上告诉了我们一些,但我需要测试它以确定。p、 s.
quo(DLX6-AS1)%%>%rlang::quo_name()
这可以正常工作。你不能用
gsub
来替换
“-”
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( row.names(dat) )
[1] "DLX6.AS1" "other"  
row.names(dat) = make.names( row.names(dat) )
quo(`DLX6-AS1`) %>% quo_name()
#> [1] "DLX6-AS1"
geneFn <- function(exp.df = seurat.object@data, gene = SOX2) {
    gene <- sub(" - ","-", deparse(enexpr(gene)))
    exp.df <- exp.df[gene, ] 
}