Простые задания с пустыми квадратными скобками? х [] <-

При взгляде на ответ, опубликованный недавно на 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)