【发布时间】:2016-10-20 10:04:44
【问题描述】:
我有很多使用$ 运算符而不是[[ 的代码。我已经阅读了[[ 的许多优点,并想重构所有代码。
下面的方法会不会有问题?我怎样才能最好地在 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 "]]
我在我的代码中发现了此方法不起作用的一个区域,现在我还找到了一种解决方法来避免该问题:Avoiding backtick characters with dplyr
df <- dat[["__Table"]] %>% select(`__ID` ) %>% mutate(fk_table = "__Table", val = 1)
在进行上述替换之前,我需要将 select 函数更改为此,以避免对反引号字符进行错误替换:
select_(as.name("__ID"))
不幸的是,列名中的__ 无法避免,因为数据是从关系数据库 (FileMaker) 下载的,需要在保留列名的同时写回数据库。
关于[[的参考:
- Code autocompletion with lists in RStudio
- 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 中重构的参考资料:
【问题讨论】:
-
老实说,我不会过多担心重构您的代码。您可能会在重构中引入更多错误,而不是离开它可能会遇到的错误。我只花了 20 分钟试图开始,我能想到的最好的方法是在所有常见情况下都无法正常工作,更不用说边缘情况了。
library(stringr) test <- c("x <- df$var_name\n", "x <- df$var_name", "x <- df$var_name ") str_replace(test, pattern = "([$])(.+)(\n|[!\"#$%&()*+,-./:;<=>?@^`{|}~])", replace = "[[\"\\2\"]]\\3") -
我赞同@Benjamin 的评论。仅修复现有代码中的重要内容,并使用您新发现的常用习语继续前进。您的
$填充代码没有错误也没有损坏。将有限的时间资源花在新的和重要的事情上。 -
感谢@Benjamin 和@hrbmstr,感谢您的cmets。在这里,重构的目的只是故事的一部分,而不仅仅是为了代码的可读性。实际上我更喜欢
$的可读性,即使它有反引号符号。我的主要目标是允许将列名作为变量传递(即使它们以_开头,并且使用不包含反引号符号的标准字符串更容易。)这有意义吗?现在有反引号的部分是硬编码的,我将转向动态计算它们。
标签: r list rstudio filemaker textwrangler