2016-11-04 7 views
0

Название самообучающееся. Хотелось бы знать, почему R выбрала переработку логических значений для выбора/подмножества? Документация "[" утверждает Such vectors are recycled if necessary to match the corresponding extent. i, jR-обоснование для переработки булевых индексов для выбора

Существуют ли какие-либо преимущества делают это? Я мог бы подумать об одном, как указано ниже, но я думаю, что недостатки могут перевесить преимущества простоты использования.

df<- data.frame(C1=1:10,c2=101:110) 
class(unclass(df)[1]) # df is a list of two lists, each a column of df 
df 
df[1] # selects 1st list (ie, first column) 
df[2] 

# However, indices are recycled if we use Logical indices 
df[TRUE] # selects both columns 
df[c(T,T),] # recycled row indices 
df[c(T,T,F),] # recycled row indices 
df[FALSE] 

# This can actually lead to inadvertent errors 
# For example, this has only 7 index elements instead of 10, 
# but it's quite possible to miss out on the fact that these are being recycled 
df[c(T,F,T,T,F,F,F),] 

Единственное использование этой функции рециркуляции, что я мог думать только о том, в skipping alternate rows

df[c(T,F),] 

Контекст задает этот вопрос является еще один я видел на SO вчера. Позднее он был удален, поскольку кто-то указал разницу между | и ||. Интересно, поняли ли они, что они также занимаются переработкой здесь.

# An erronous use of && can land you in soup too 
    df [df$C1 >0 && df$c2 <102, ] #returns TRUE, will select all rows 

Существуют ли какие-либо другие хорошо известные подводные камни такого рода, что один должен быть осторожны?

ответ

1

Преимущества:

Позволяет выбрать все п-ю строку столбца в векторе или data.frame или матрицы:

> m <- matrix(1:20, 4) 
> m[c(TRUE,FALSE), ] 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 5 9 13 17 
[2,] 3 7 11 15 19 
> m[, c(TRUE,FALSE) ] 
    [,1] [,2] [,3] 
[1,] 1 9 17 
[2,] 2 10 18 
[3,] 3 11 19 
[4,] 4 12 20 

Каждый третий столбец:

> m[, c(TRUE,FALSE,FALSE) ] 
    [,1] [,2] 
[1,] 1 13 
[2,] 2 14 
[3,] 3 15 
[4,] 4 16 

Упомянутое невыгодное действительно является неправильным использованием оператора && (который, я думаю, вы действительно понимаете). Этот оператор только когда-либо возвращает вектор длины-1 и обычно неуместен при попытке индексирования. Вероятно, это была путаница, проявленная вопрошающим, который использовал оператор ||.

В конечном счете ответ заключается в том, что авторам это понравилось. R является клоном в большинстве семантик S, и он был построен на заре языков высокого уровня в аналитическом центре AT & T.

+0

О, спасибо, что ответили на этот вопрос. Да, конечно, я хорошо понял проблему с &&. Я просто комментировал, почему один индекс значения возвратил весь столбец. И, конечно же, я также осознал удобство использования утилизации. Undisputed. Тем не менее, это просто заставило меня задуматься, может ли я в какой-то момент сделать ошибку с индексированием и не осознал этого из-за утилизации. Последняя часть ответа действительно поражает меня. Кажется, это разветвление того, как «традиция», или, скорее, эволюционные корни, формовали язык. –

+0

Тот факт, что NA в качестве индекса матрицы данных возвращает строку (или столбец) NA, является тем, что меня заводит. –

+0

Да, другая логическая константа. И вы тоже можете его переработать. 'Some.matrix [Н. А., Н. А.]' –

 Смежные вопросы

  • Нет связанных вопросов^_^