Какие имена 1-2 имен объектов конфликтуют с существующими объектами R?

Чтобы сделать мой код более читаемым, мне нравится избегать имен объектов, которые уже существуют при создании новых объектов. Из-за основанного на пакетах характера R, и поскольку функции являются объектами первого класса, легко заменить типичные функции, которые не находятся в базе R (поскольку обычный пакет может использовать короткое имя функции, но не зная, какой пакет нагрузка отсутствует, чтобы проверить его). Такие объекты, как встроенные логики T и F, также вызывают проблемы.

Некоторые примеры, которые приходят на ум, следующие:

Одна буква

  • с
  • t
  • T/F
  • J

Две буквы

  • ДФ
Лучшее решение может заключаться в том, чтобы избежать коротких имен вообще в пользу более описательных, и я обычно стараюсь делать это по привычке. Тем не менее "df" для функции, которая управляет общим файлом data.frame, описана много, а более длинное имя мало добавляет, поэтому короткие имена используют их. Кроме того, для вопросов SO, где больший контекст не обязательно известен, придумывание описательных имен практически невозможно.

Какие еще одно- и двухбуквенные имена переменных конфликтуют с существующими объектами R? Какие из них достаточно распространены, их следует избегать? Если они не находятся в base, перечислите также пакет. Лучшие ответы будут включать по крайней мере некоторый код; укажите его, если он используется.

Обратите внимание, что я не спрашиваю, целесообразно или нет переписывающие функции, которые уже существуют. Этот вопрос уже адресован на SO:

В R, что конкретно представляет собой проблема с переменными с тем же именем, что и базовые функции R?

Для визуализации некоторых ответов здесь см. этот вопрос в CV:

https://stats.stackexchange.com/info/13999/visualizing-2-letter-combinations

Ответ 1

apropos идеально подходит для этого:

apropos("^[[:alpha:]]{1,2}$")

Без загрузки пакетов это возвращает:

 [1] "ar" "as" "by" "c"  "C"  "cm" "D"  "de" "df" "dt" "el" "F"  "gc" "gl"
[15] "I"  "if" "Im" "is" "lh" "lm" "ls" "pf" "pi" "pt" "q"  "qf" "qr" "qt"
[29] "Re" "rf" "rm" "rt" "sd" "t"  "T"  "ts" "vi"

Точное содержимое будет зависеть от списка поиска. Попробуйте загрузить несколько пакетов и повторно запустить его, если вы беспокоитесь о конфликтах с пакетами, которые вы обычно используете.


Я загрузил все ( > 200) пакеты, установленные на моей машине, с помощью этого:

lapply(rownames(installed.packages()), require, character.only = TRUE)

И повторите вызов apropos, обернув его в unique, так как было несколько дубликатов.

one_or_two <- unique(apropos("^[[:alpha:]]{1,2}$"))

Это возвращает:

  [1] "Ad" "am" "ar" "as" "bc" "bd" "bp" "br" "BR" "bs" "by" "c"  "C" 
 [14] "cc" "cd" "ch" "ci" "CJ" "ck" "Cl" "cm" "cn" "cq" "cs" "Cs" "cv"
 [27] "d"  "D"  "dc" "dd" "de" "df" "dg" "dn" "do" "ds" "dt" "e"  "E" 
 [40] "el" "ES" "F"  "FF" "fn" "gc" "gl" "go" "H"  "Hi" "hm" "I"  "ic"
 [53] "id" "ID" "if" "IJ" "Im" "In" "ip" "is" "J"  "lh" "ll" "lm" "lo"
 [66] "Lo" "ls" "lu" "m"  "MH" "mn" "ms" "N"  "nc" "nd" "nn" "ns" "on"
 [79] "Op" "P"  "pa" "pf" "pi" "Pi" "pm" "pp" "ps" "pt" "q"  "qf" "qq"
 [92] "qr" "qt" "r"  "Re" "rf" "rk" "rl" "rm" "rt" "s"  "sc" "sd" "SJ"
[105] "sn" "sp" "ss" "t"  "T"  "te" "tr" "ts" "tt" "tz" "ug" "UG" "UN"
[118] "V"  "VA" "Vd" "vi" "Vo" "w"  "W"  "y"

Вы можете видеть, откуда они пришли с помощью

lapply(one_or_two, find)

Ответ 2

Думал об этом больше. Здесь список однобуквенных имен объектов в базе R:

> var.names <- c(letters,LETTERS)
> var.names[sapply(var.names,exists)]
[1] "c" "q" "t" "C" "D" "F" "I" "T" "X"

И одно- и двухбуквенные имена объектов в базе R:

one.letter.names <- c(letters,LETTERS)

N <- length(one.letter.names)


first <- rep(one.letter.names,N)
second <- rep(one.letter.names,each=N)

two.letter.names <- paste(first,second,sep="")

var.names <- c(one.letter.names,two.letter.names)

> var.names[sapply(var.names,exists)]
[1] "c"  "d"  "q"  "t"  "C"  "D"  "F"  "I"  "J"  "N"  "T"  "X"  "bc" "gc"
[15] "id" "sd" "de" "Re" "df" "if" "pf" "qf" "rf" "lh" "pi" "vi" "el" "gl"
[29] "ll" "cm" "lm" "rm" "Im" "sp" "qq" "ar" "qr" "tr" "as" "bs" "is" "ls"
[43] "ns" "ps" "ts" "dt" "pt" "qt" "rt" "tt" "by" "VA" "UN"

Это гораздо больший список, чем я подозревал вначале, хотя я бы никогда не подумал об именовании переменной "если", поэтому в определенной степени это имеет смысл.

Все еще не фиксирует имена объектов не в базе или не дает никакого представления о том, какие функции лучше всего избегать. Я думаю, что лучший ответ мог бы либо использовать мнение экспертов, чтобы выяснить, какие функции важны (например, использование c, вероятно, хуже, чем использование qf), или использовать метод интеллектуального анализа данных на связке R-кода, чтобы увидеть, что кратко функции наиболее часто используются.