是否将带破折号的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”
Thenexp.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, ]
}