2016-10-20 12 views
5

У меня есть много кода, который использует оператор $, а не [[. Я читал о многих преимуществах [[ и хотел бы реорганизовать весь код.

Возникли проблемы со следующим методом? И как мне лучше всего выполнить поиск и заменить RStudio или TextWrangler на Mac?

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) и должны быть записаны обратно в базу данных при сохранении имен столбцов.

Список литературы о [[:

Справки о рефакторинге в R:

+0

Честно говоря, я бы не стал слишком беспокоиться о реорганизации вашего кода. Вероятно, вы собираетесь ввести больше ошибок в рефакторинг, чем вы, вероятно, испытаете, оставив его. Я просто потратил 20 минут, пытаясь начать, и лучшее, что я могу придумать, не приходит туда, где почти все обычные случаи, не говоря уже о крайних случаях. 'Библиотека (stringr) тест <- с ("х <- DF $ имя_переменной \ п", "х <- DF $ имя_переменной", "х <- DF $ имя_переменной") str_replace (тест, узор = "([$]) (. +) (\ n | [! \" # $% &() * +, -./:; <=>? @^\ '{|} ~])", replace = " [[\ "\\ 2 \"]] \\ 3 ")' – Benjamin

+1

I second @ комментарий Бенджамина. Исправьте только важные вещи в существующем коде и используйте вашу новую игру fav-идиомы, двигающуюся вперед. Ваш '' '-полный код не ошибается и не нарушайте. Проведите свой ограниченный ресурс времени на новые и важные вещи. – hrbrmstr

+0

Спасибо @Benjamin и @hrbmstr, я ценю ваши комментарии. Здесь цель рефакторинга - это лишь часть истории, а не только для чтения кода. предпочитают '' 'для удобочитаемости, даже если у него есть символы обратной ссылки. Мои главные цели - разрешить прохождение столбца nam es как переменные (даже когда они начинаются с '_', и это проще со стандартными строками, которые не содержат символов обратного вызова.) Имеет ли это смысл? Теперь части, имеющие обратные сигналы, жестко закодированы, и я буду двигаться к их динамическому вычислению. – Bobby

ответ

4

Вы можете попробовать:

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")) 
+0

Это выглядит очень обнадеживающим. Вы знаете, как применить его ко всему файлу .r? – Bobby

+0

@Bobby Может быть, 'stri_replace_all_fixed (readLines (" script.R "), c ('$'', '''), c (" [['","']] "), vectorize_all = FALSE)'? –

+0

Я все еще думаю, что это фантастический ответ для конкретной части моего вопроса. В общем, я еще не уверен. Как я могу убедиться, что у меня нет символов обратной ссылки, которые нельзя заменить? – Bobby