Какие 1-2-буквенные имена объектов конфликтуют с существующими объектами R? - PullRequest
14 голосов
/ 08 августа 2011

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

Вот некоторые примеры, которые приходят на ум:

Одна буква

  • C
  • т
  • T / F
  • J

Две буквы

  • DF

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

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

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

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

Визуализации некоторых ответов здесь, см. Этот вопрос в резюме:

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

Ответы [ 2 ]

18 голосов
/ 08 августа 2011

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)
4 голосов
/ 08 августа 2011

Думал об этом больше.Вот список однобуквенных имен объектов в базе 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, чтобы увидеть, что с коротким именемфункции привыкают чаще всего.

...