代码重构:从 $ 到 [[

Code refactoring: from $ to [[

我有很多代码使用 $ 运算符而不是 [[。我已经阅读了 [[ 的许多优点,并想重构所有代码。

下面的方法会不会有问题?我怎样才能最好地在 Mac?

上用 RStudio 或 TextWrangler 进行搜索和替换
l <- list()
l$`__a` <- data.frame(`__ID` = stringi::stri_rand_strings(10, 1), col = stringi::stri_rand_strings(10, 1), check.names = F )

代码现在看起来像这样:

l$`__a`$`__ID`

我想将其重构为:

l[["__a"]][["__ID"]]

要实现这一点,以下替换是否足够?

$` to [["

` to "]]

我在我的代码中发现了这个方法不起作用的地方,现在我也找到了一个解决方法来避免这个问题:

df <- dat[["__Table"]] %>% select(`__ID` ) %>% mutate(fk_table = "__Table", val = 1)

在进行上述替换之前,我需要将 select 函数更改为此,以避免对反引号字符进行错误替换:

select_(as.name("__ID"))

不幸的是,列名中的 __ 无法避免,因为数据是从关系数据库 (FileMaker) 下载的,需要在保留列名的同时写回数据库。

关于 [[ 的参考:

关于 R 中重构的参考资料:

你可以试试:

v <- c("l$`__a`$`__ID`")

library(stringi)
stri_replace_all_fixed(v, c('$`', '`'), c('[["', '"]]'), vectorize_all = FALSE)

给出:

#[1] "l[[\"__a\"]][[\"__ID\"]]"

注意: 您会在输出中看到 \",因为 print() 在显示引号时会转义引号。您可以将上面的内容包装在 noquote() 中以查看没有 \"

的输出
noquote(
  stri_replace_all_fixed(v, c('$`', '`'), c('[["', '"]]'), vectorize_all = FALSE)
)

给出:

#[1] l[["__a"]][["__ID"]]

如果您想将此应用到整个文件,您可以尝试:

writeLines(stri_replace_all_fixed(readLines("script.R"), 
                                  c('$`', '`'), c('[["', '"]]'), vectorize_all = FALSE),
           file("new_script.R"))