【发布时间】:2021-12-03 19:17:47
【问题描述】:
我正在处理 r 中真正让我感到困惑的一个方面。我构建的是一行代码调用 str_remove 保存为字符串。如果我将该字符串复制粘贴到我想使用这行代码的位置,它会按预期完美运行。 但是我无法让 r 正确解释此代码。我试过使用例如解析,但用于 str_remove 正则表达式的转义字符会引发错误。
难道没有一种简单的方法可以将字符串视为一行输入的代码吗?
这是我的可重现示例:
制作玩具数据:
maf_list_context <- list(as.data.frame(cbind(c("ATTATCGAATT", "ATTATTTTAAA"), c("this one", "not that one"))),
as.data.frame(cbind(c("ATTACGTAATT", "ATTATTTTAAA"), c("this one too", "not that one either"))) )
maf_list_context <- lapply(maf_list_context, function(x)
{colnames(x) <- c("CONTEXT", "want_it")
return(x)
})
这个想法是上下文将是一个函数的参数并且它可以是灵活的,因此用户可以提供任意数量的以逗号分隔的感兴趣的上下文。这些将是 stringr 正则表达式,旨在在一串 11 个碱基中查找 DNA 中的特定上下文。例如,在这里我们可以使用两个感兴趣的上下文。下面的代码将这些组合起来,形成一个表达式,供以后从列表中的数据框中选择适当的行。
context <- "\\w{5}CG\\w{4}, \\w{4}CG\\w{5}"
contextvec <- unlist(str_split(context, pattern = ", "))
contextexpression <- c()
for(i in 1:length(contextvec)){
contextexpression <- paste0(contextexpression, "str_detect(x$CONTEXT, pattern = '", contextvec[i], "') |")
}
contextexpression <- str_remove(contextexpression, pattern = " \\|$")
'contextexpression' 现在是:
[1] "str_detect(x$CONTEXT, pattern = '\\w{5}CG\\w{4}') |str_detect(x$CONTEXT, pattern = '\\w{4}CG\\w{5}')"
如果我将此表达式直接粘贴到 apply 中,它会完全按照我的意愿工作。
> lapply(maf_list_context, function(x){
+
+ x[str_detect(x$CONTEXT, pattern = '\\w{5}CG\\w{4}') |str_detect(x$CONTEXT, pattern = '\\w{4}CG\\w{5}'), ]
+
+ })
[[1]]
CONTEXT want_it
1 ATTATCGAATT this one
[[2]]
CONTEXT want_it
1 ATTACGTAATT this one too
当然,如果我在那里使用字符串,它不会。
> lapply(maf_list_context, function(x){
+
+ x[contextexpression, ]
+
+ })
[[1]]
CONTEXT want_it
NA <NA> <NA>
[[2]]
CONTEXT want_it
NA <NA> <NA>
我尝试了许多不同的功能,但没有一个可以使这项工作。有没有办法让 r 像我直接输入一样解释这个字符串?
整个reprex:
if (!require("stringr") {
install.packages("stringr", dependencies = TRUE)
library("stringr")
maf_list_context <- list(as.data.frame(cbind(c("ATTATCGAATT", "ATTATTTTAAA"), c("this one", "not that one"))),
as.data.frame(cbind(c("ATTACGTAATT", "ATTATTTTAAA"), c("this one too", "not that one either"))) )
maf_list_context <- lapply(maf_list_context, function(x){
colnames(x) <- c("CONTEXT", "want_it")
return(x)
})
context <- "\\w{5}CG\\w{4}, \\w{4}CG\\w{5}"
contextvec <- unlist(str_split(context, pattern = ", "))
contextexpression <- c()
for(i in 1:length(contextvec)){
contextexpression <- paste0(contextexpression, "str_detect(x$CONTEXT, pattern = '", contextvec[i], "') |")
}
contextexpression <- str_remove(contextexpression, pattern = " \\|$")
maf_list_select <- lapply(maf_list_context, function(x){
x[contextexpression, ]
})
【问题讨论】:
-
你所追求的是
eval(parse(text=*))。但是 1) 如果答案是 eval+parse,那么您可能问错了问题; 2)我认为你可能对 R 有点缺乏经验来考虑这样的事情。寻找更简单的方法来做你正在做的事情 -
嗨,洪,我已经尝试过 eval(parse(text = *))。但是,正如我在帖子中提到的,由于正则表达式,它会引发错误。 h(simpleError(msg, call)) 中的错误:在为函数 'eval' 选择方法时评估参数 'expr' 时出错:'\w' 是开始于 "'\w" 的字符串中无法识别的转义做我正在做的事情,我会欢迎建议!