Простые задания с пустыми квадратными скобками? х [] <-
При взгляде на ответ, опубликованный недавно на SO, я заметил незнакомую инструкцию присваивания. Вместо обычной формы myVar<- myValue
она использовала для myVar[]<- myValue
. Лично я никогда не видел такого задания, но он имел очень полезный эффект - он преобразовал назначенные данные myValue в форму myVar.
Я хотел бы использовать это в своем коде. Однако документация для "<-"
, похоже, молчала.
Является ли это хорошо зарекомендовавшей себя функцией, и на нее можно положиться, чтобы работать во всех случаях?
Кроме того, я предполагаю, что это может быть побочным эффектом стека вызовов функций, т.е. вызывать <-
и [
в последовательности, но я не мог понять, как это сделать. Может кто-то пролить свет на это?
Здесь пример -
# A dataframe
df1<- data.frame(a=1:4, b=11:14)
# simple assignment assigns to class of RHS
df1<- c(21:24,31:34)
df1
#[1] 21 22 23 24 31 32 33 34
class(df1)
#[1] "integer"
#assignment with [] casts to class of LHS
df1<- data.frame(a=1:4, b=11:14)
df1[]<- c(21:24,31:34)
df1
# a b
# 1 21 31
# 2 22 32
# 3 23 33
# 4 24 34
# recycling to preserve shape
df1[]<- c(101:102)
df1
# a b
# 1 101 101
# 2 102 102
# 3 101 101
# 4 102 102
class(df1)
#data.frame
# reshaping
df1<- data.frame(a=1:4, b=11:14)
df1[] <- matrix(1:8, 2,4)
df1 #matrix reshaped
class(df1)
#[1] "data.frame"
# flattening
x<- 1:8
x[]<- matrix(1:8,4,2)
x
#[1] 1 2 3 4 5 6 7 8
Ответы
Ответ 1
Это преднамеренная и документированная функция. Как упоминалось в joran, страница документации "Извлечение" включает это в раздел "Атомные векторы":
Пустой индекс выбирает все значения: это чаще всего используется для замены всех записей, но сохраняет атрибуты.
Однако, в случае рекурсивных объектов (data.frames
или lists
, например), атрибуты сохраняются только для подмножества объектов. Его части не получают такой защиты.
Вот пример:
animals <- factor(c('cat', 'dog', 'fish'))
df_factor <- data.frame(x = animals)
rownames(df_factor) <- c('meow', 'bark', 'blub')
str(df_factor)
# 'data.frame': 3 obs. of 1 variable:
# $ x: Factor w/ 3 levels "cat","dog","fish": 1 2 3
df_factor[] <- 'cat'
str(df_factor)
# 'data.frame': 3 obs. of 1 variable:
# $ x: chr "cat" "cat" "cat"
rownames(df_factor)
# [1] "meow" "bark" "blub"
df_factor
сохранил свой атрибут rownames
, но столбец x
- это только вектор символов, используемый в присваивании вместо фактора. Мы можем сохранить класс и уровни x
, специально заменив его значения:
df_factor <- data.frame(x = animals)
df_factor$x[] <- 'cat'
str(df_factor)
# 'data.frame': 3 obs. of 1 variable:
# $ x: Factor w/ 3 levels "cat","dog","fish": 1 1 1
Таким образом, замена пустым подмножеством очень безопасна для векторов, матриц и массивов, потому что их элементы не могут иметь свои собственные атрибуты. Но это требует некоторой осторожности при работе со спискообразными объектами.
Ответ 2
Я обычно использую []
для подмножества данных, где df1[2]
- столбец 2 из df1
. В вашем примере вы используете его, чтобы указать местоположение, которое матрица или вектор помещается в df1
. Если вы хотите быть на 100% уверенным, что он помещен в правильный столбец, вы можете вызвать правильный столбец, чтобы поместить данные матрицы, например:
#create data frame df
df1<- data.frame(a=1:4, b=11:14)
#overwrite column 1 and 2 with matrix
df1[1:2] <- matrix(1:8, 2,4)
или если вы хотите добавить два дополнительных столбца, например, столбцы 3 и 4:
#create data frame df
df1<- data.frame(a=1:4, b=11:14)
#matrix to data frame df in column 3 and 4
df1[3:4] <- matrix(1:8, 2,4)