ДК
$
для data.frame
интерпретирует его как список и извлекает элемент с потерей атрибута родительского объекта и ожидать от него аналогичного поведения с [.data.frame
не стоит.Size: a a a
ДК
$
для data.frame
интерпретирует его как список и извлекает элемент с потерей атрибута родительского объекта и ожидать от него аналогичного поведения с [.data.frame
не стоит.АК
ДК
[
, получается, что mpg$var_new
не отличается от mpg$var_new[1]
, а дальше уже приписование векторизованоdf$gamma[1] <- 1сначала создает вектор длины 1, в который записывает 1, а затем, по сути, происходит cbind уже существующего df и созданного вектора длиной 1.
⌨
df$gamma[1] <- 1сначала создает вектор длины 1, в который записывает 1, а затем, по сути, происходит cbind уже существующего df и созданного вектора длиной 1.
`$<-.data.frame`(x, name, value)
и в качестве value
передается rhs
. Не очень понятно, как здесь используется [1]
, но можно поставить эксперимент, демонстрирующий ресайклинг - в датасет mtcars который имеет 32 строки попытаться записать вектор размера 3 и получить соответствующую ошибку.mtcars$temp[2:3] <- 1:
2
Интересно, что обновление уже существующего столбца работает нормально, там видимо методы резолвятся по-другому.`[`
и `[<-`
и посмотрел, что приходит на вход. В случае нового столбца это (для моего примера) NULL, 2:3, 1:2
, а в случае существующего вместо NULL
приходя значения. Тут собственно и кроется разгадка.`[<-`(NULL, 2:3, 1:2)возвращает
NA, 1, 2
, а если вместо NULL
вектор с данными - то корректно заменяет значения и возвращает новую копию.mtcars$temp[2:3] <- 1:
2
ведет себя, видимо, как-то так`$<-`(
mtcars, "temp",
`[<-`(
`$`(mtcars, "temp"),
2:3, 1:2))
e
IM
ДК
`$<-.data.frame`(x, name, value)
и в качестве value
передается rhs
. Не очень понятно, как здесь используется [1]
, но можно поставить эксперимент, демонстрирующий ресайклинг - в датасет mtcars который имеет 32 строки попытаться записать вектор размера 3 и получить соответствующую ошибку.mtcars$temp[2:3] <- 1:
2
Интересно, что обновление уже существующего столбца работает нормально, там видимо методы резолвятся по-другому.`[`
и `[<-`
и посмотрел, что приходит на вход. В случае нового столбца это (для моего примера) NULL, 2:3, 1:2
, а в случае существующего вместо NULL
приходя значения. Тут собственно и кроется разгадка.`[<-`(NULL, 2:3, 1:2)возвращает
NA, 1, 2
, а если вместо NULL
вектор с данными - то корректно заменяет значения и возвращает новую копию.mtcars$temp[2:3] <- 1:
2
ведет себя, видимо, как-то так`$<-`(
mtcars, "temp",
`[<-`(
`$`(mtcars, "temp"),
2:3, 1:2))
df <- data.frame(alpha = c(1,2,3),
beta = c(1,2,3))
df$gamma[2:3] <- 1:2
View(df)
df <- data.frame(alpha = c(1,2,3,4),
beta = c(1,2,3,4))
df$gamma[2:3] <- 1:2
View(df)
ДК
`$<-.data.frame`(x, name, value)
и в качестве value
передается rhs
. Не очень понятно, как здесь используется [1]
, но можно поставить эксперимент, демонстрирующий ресайклинг - в датасет mtcars который имеет 32 строки попытаться записать вектор размера 3 и получить соответствующую ошибку.mtcars$temp[2:3] <- 1:
2
Интересно, что обновление уже существующего столбца работает нормально, там видимо методы резолвятся по-другому.`[`
и `[<-`
и посмотрел, что приходит на вход. В случае нового столбца это (для моего примера) NULL, 2:3, 1:2
, а в случае существующего вместо NULL
приходя значения. Тут собственно и кроется разгадка.`[<-`(NULL, 2:3, 1:2)возвращает
NA, 1, 2
, а если вместо NULL
вектор с данными - то корректно заменяет значения и возвращает новую копию.mtcars$temp[2:3] <- 1:
2
ведет себя, видимо, как-то так`$<-`(
mtcars, "temp",
`[<-`(
`$`(mtcars, "temp"),
2:3, 1:2))
df$new.var < vector1работает, если длина вектора vector1 кратна длине других переменных в датафрейме df, и выдает ошибку в другом случае, что в моем случае было ожидаемо:
df <- data.frame(alpha = 1:6,
beta = 1:6)
df$gamma[2:3] <- 1:2
View(df)
⌨
df <- data.frame(alpha = c(1,2,3),
beta = c(1,2,3))
df$gamma[2:3] <- 1:2
View(df)
df <- data.frame(alpha = c(1,2,3,4),
beta = c(1,2,3,4))
df$gamma[2:3] <- 1:2
View(df)
base::`[<-`
, который содержит внутри вызов .Primitive("<-")
и заменил на function(...) {print(list(...)); .Primitive("[<-")}
Это хоть и не гарантирует корректной работы, но позволяет увидеть, что прилетает в этот оператор в качестве входных параметров⌨
df$new.var < vector1работает, если длина вектора vector1 кратна длине других переменных в датафрейме df, и выдает ошибку в другом случае, что в моем случае было ожидаемо:
df <- data.frame(alpha = 1:6,
beta = 1:6)
df$gamma[2:3] <- 1:2
View(df)
`$<-.data.frame`
. В любом случае, мне был не понятен стэк вызова и какие именно S3
методы вызывались, поэтому захотелось разобраться.АК
df <- data.frame(alpha = c(1,2,3),
beta = c(1,2,3))
df$gamma[2:3] <- 1:2
View(df)
df <- data.frame(alpha = c(1,2,3,4),
beta = c(1,2,3,4))
df$gamma[2:3] <- 1:2
View(df)
АК
ДК
`$<-.data.frame`
. В любом случае, мне был не понятен стэк вызова и какие именно S3
методы вызывались, поэтому захотелось разобраться.'[<-'(NULL, 2:3, 1:2), то все выражение
(NULL, 2:3, 1:2)воспринимается как вектор, который нужно присоединить к уже существующему датафрейму. Если я правильно понимаю. Если же вместо NULL - вектор, то сначала в нем производится замена, а потом он уже присоединяется. В случае вызова
df[2:3,"new.vector"] <- 1:2сначала создается новый вектор внутри датафрейма df (длины, равной длине других векторов в датафрейме, со всеми значениями, равными NA), который затем уже передается
[<-. Кажется, так.
A
э
i
АК
э
АК
э