代码重构:从 $ 到 [[
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) 下载的,需要在保留列名的同时写回数据库。
关于 [[
的参考:
- Is it possible to index an R list using a character variable and the '$' operator?
- The difference between [] and [[]] notations for accessing the elements of a list or dataframe
关于 R 中重构的参考资料:
- R language aware code reformatting/refactoring tools?
- Tips for refactoring repetitive code in 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"))
我有很多代码使用 $
运算符而不是 [[
。我已经阅读了 [[
的许多优点,并想重构所有代码。
下面的方法会不会有问题?我怎样才能最好地在 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) 下载的,需要在保留列名的同时写回数据库。
关于 [[
的参考:
- Is it possible to index an R list using a character variable and the '$' operator?
- The difference between [] and [[]] notations for accessing the elements of a list or dataframe
关于 R 中重构的参考资料:
- R language aware code reformatting/refactoring tools?
- Tips for refactoring repetitive code in 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"))