我使用的是Rstudio 1.4.1106,我们都知道我们可以使用Ctrl + F
来查找或替换。通常,Rstudio会在任何一行代码中查找/替换,包括注释行(以#开头的行)。我希望只在(实际的)命令行中查找/替换(实际做某事的命令,即使该行末尾可能有#用于注释)。
你有什么解决办法吗?
您可以使用正则表达式查找并忽略以注释符号开头的行。例如,您可以输入(?<!#.*)bsearchStringb
来忽略以#
开头的行中的匹配内容。
这基本上是为#
做一个消极的向后看,以确保它不匹配之前有一个#
的searchString,向后看中的量词确保我们排除像# some things searchString
这样的东西。这对于正则表达式来说不是很理想,在一些不允许非固定宽度的语言中可能不起作用,但它在rstudio中的查找和替换正则表达式中起作用,因此应该服务于OP的目的。让我知道,如果有任何边缘情况,这个正则表达式是缺失的。
在尝试之前不要忘记勾选正则表达式框!
你可以写一个R函数,只在非注释区域修改文件:
library(tidyverse)
file_replace <- function(file, ...) {
file %>%
read_lines() %>%
map_chr(function(l) {
if(l %>% str_starts("#")) {
# comment
l
} else {
# code
parts <- l %>% str_split("#") %>% simplify()
if(length(parts) == 2) {
# code line contains comment
paste0(
parts[[1]] %>% str_replace_all(...),
"#",
parts[[2]]
)
} else {
l %>% str_replace_all(...)
}
}
}) %>%
write_lines(file)
}
输入文件foo.R
:
#' foo
#' @param foo: number to increase
f <- function(foo) {
foo + 1 # increasing the foo
}
执行替换:
file_replace("foo.R", pattern = "f[o]{2}", replacement = "bar")
替换后的输出文件foo.R
:
#' foo
#' @param foo: number to increase
f <- function(bar) {
bar + 1 # increasing the foo
}
这个例子也说明了这种方法的危险:这样做,您不会更新作为注释一部分的文档字符串!