Когда после имени появляется открывающая скобка (
, R будет обрабатывать все, что приходит перед скобками, как функцию и передает все внутри скобки этой функции в качестве аргументов. .
Я начинаю с этого, потому что функции оцениваются с высоким приоритетом, поэтому "Что означает (l1)[l1]
" - это неправильный вопрос, сначала levels(l1)
, а затем [l1]
результат levels(l1)
.
Например:
log(1:3)
Вызывает функцию log()
для вектора 1, 2, 3
.
log(c(1, 5, 7))
Вызывает функцию c()
1, 5, 7 для создания вектора 1, 5, 7
, затем вызывает функцию log()
для вектора 1, 5, 7
.
log(c(1, 5, 7))[2]
Вызывает функции c()
, а затем log()
, как описано выше, а затем вызывает функцию [
для результата, извлекая 2-й элемент результата log()
.
factor( c( levels(l1)[l1], levels(l2)[l2] ) ) # some spaces added for clarity
- Вызывает функцию
levels()
для объекта l1
- выводит результат с
[
, основываясь на значениях в l1
- Вызывает функцию
levels()
для объекта l2
- выводит результат с
[
, основываясь на значениях в l2
- Звонит
c()
по результатам, упомянутым выше
- Вызов
factor()
по результату c()
Что делает levels(l1)[l1]
? Насколько я могу судить, это странный способ получить тот же результат, что и as.character(l1)
:
set.seed(47) # for reproducibility
l1 = factor(sample(letters, size = 10, replace = TRUE))
l2 = factor(sample(letters, size = 10, replace = TRUE))
l1
# [1] z j t v o r k m o y
# Levels: j k m o r t v y z
levels(l1)
# [1] "j" "k" "m" "o" "r" "t" "v" "y" "z"
levels(l1)[l1]
# [1] "z" "j" "t" "v" "o" "r" "k" "m" "o" "y"
identical(as.character(l1), levels(l1)[l1])
# [1] TRUE
Итак, в целом, я думаю, что цель factor(c(levels(l1)[l1], levels(l2)[l2]))
состоит в том, чтобы объединить векторы l1
и l2
, с коэффициентом в результате. Я думаю, что более ясный способ сделать это -
factor(c(as.character(l1), as.character(l2)))
# [1] z j t v o r k m o y d s e p n x k a b m
# Levels: a b d e j k m n o p r s t v x y z