Добавление в столбцы правильного пути - PullRequest
2 голосов
/ 19 апреля 2019

У меня есть простой DT, и я хотел бы добавить столбец к остальным.Код выглядит следующим образом: (работает)

x <- data.table(a=1:5,b=5:1,c=rep(999,5))
for(k in c("a","b")){x[,k] <- x[,..k]+x[,.(c)]}

Теперь возникает вопрос: почему я должен использовать .. для назначения?Также, если я пытаюсь использовать .. в первом случае, то есть

for(k in c("a","b")){x[,..k] <- x[,..k]+x[,.(c)]}

Ошибка: «[...] объект '..k' не найден».Это кажется странным, что мне нужно изменить синтаксис внутри области действия.

Теперь в dataframe эквивалентная формулировка очень ясна:

for(k in c("a","b")){x[,k] <- x[,k]+x[,c]} # error with DT
x <- data.frame(a=1:5,b=5:1,c=rep(999,5))
for(k in c("a","b")){x[,k] <- x[,k]+x[,"c"]} # works with dataframe

Так что мне интересно (1)если приведенный выше код является правильным способом сделать это в datatable (пожалуйста, объясните оператор .., в FAQ 1.1 по датированным данным это конкретно не рассматривается);и если (2) есть альтернативные способы написать это более чистым способом.Спасибо за любые подсказки.

1 Ответ

1 голос
/ 19 апреля 2019

из официального введения (слегка отредактировано для вашего примера):

Для тех, кто знаком с терминалом Unix, префикс .. должен напоминать «up-команда «одноуровневая», которая аналогична происходящему здесь - сигналы .. передаются в data.table для поиска переменной k «up-one-level», т. е. в данном случае в среде цикла.

Таким образом, этот оператор экранирует фрейм данных и ищет переменную k на одном более высоком уровне, получает значение и возвращается.Не уверен, почему они сделали это так, но, возможно, переменные не передаются.

Вы также можете использовать аргумент with:

x[,k,with=FALSE]


Редактировать:

Я только что проверил исходный код data.table.Они получают вызванную переменную из parent.frame(), поэтому среда, в которой вызывается функция, вызывается.Это вызывается аргументом .. или with.Поэтому, если вы не используете его, функция не сможет получить параметры среды.

Вопрос о parent.frame() найден здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...