knitr получает обманутые data.table `: =` назначение

Кажется, что knitr не понимает, что DT[, a:=1] не должен приводить к выходу DT в документ. Есть ли способ остановить это поведение?

Пример документа:

 Data.Table Markdown ======================================================== Suppose we make a `data.table` in **R Markdown** ```{r} DT = data.table(a = rnorm(10)) ``` Notice that it doesn't display the contents until we do a ```{r} DT ``` style command. However, if we want to use `:=` to create another column ```{r} DT[, c:=5] ``` It would appear that the absence of a equals sign tricks `knitr` into thinking this is to be printed. 

Knitr Выход:

введите описание изображения здесь

Является ли это ошибкой knitr или ошибкой data.table ?

РЕДАКТИРОВАТЬ

Я только что заметил, что knitr странно, когда он echo коду. Посмотрите на вышеприведенный результат. В моем исходном коде у меня есть DT[, c:=5] но то, что делает knitr

 DT[, `:=`(c, 5)] 

Weird …

EDIT 2: Кэширование

Кэширование также, по-видимому, имеет проблему с := но это должно быть другой причиной, поэтому здесь возникает отдельный вопрос: почему кеширование knitr терпит неудачу для data.table `: =`?

Обновление Oct 2014 . Теперь в data.table v1.9.5:

:= больше не печатает в knitr для согласованности с поведением в строке # 505 . Выход тестового knit("knitr.Rmd") теперь находится в модульных тестах data.table.

и связанные с ними:

if (TRUE) DT[,LHS:=RHS] теперь не печатает (благодаря Jureiss, № 869 ). Добавлен тест. Чтобы заставить это работать, нам пришлось жить с одним недостатком: если a := используется внутри функции без DT[] до конца функции, тогда в следующий раз, когда DT будет введен в строке, ничего не будет распечатаны. Повторный DT будет печататься. Чтобы этого избежать: включить DT[] после последнего := в вашу функцию. Если это невозможно (например, это не функция, которую вы можете изменить), то print(DT) и DT[] в приглашении гарантированно будет напечатана. Как и прежде, добавление дополнительного [] в конце запроса := является рекомендуемой идиомой для обновления, а затем для печати; например > DT[,foo:=3L][]



Предыдущий ответ сохранен для потомков ( global$depthtrigger бизнес global$depthtrigger больше не выполняется, как из data.table v1.9.5, так что это уже не так) …

Чтобы быть ясным, я понимаю тогда: knitr печатает, когда вы этого не хотите.

Попытайтесь увеличить значение data.table:::.global$depthtrigger в начале скрипта.

Это будет 3 для вас:

 data.table:::.global$depthtrigger [1] 3 

Я не знаю, сколько knitr увеличивается в стек. Но сначала попробуйте сменить триггер на 4; т.е.

 assign("depthtrigger", 4, data.table:::.global) 

и в конце скрипта knitr убедитесь, что он вернулся к 3. Если 4 не работает, попробуйте 5, затем 6. Если вы доберетесь до 10, сдайтесь, и я снова подумаю. ;-П

Почему это может сработать?

См. НОВОСТИ от v1.8.4:

DT[,LHS:=RHS,...] больше не печатает DT . Это реализует # 2128 «Попробуйте снова получить DT[i,j:=value] чтобы вернуться невидимо». Благодаря обсуждениям здесь:
как подавить вывод при использовании `: =` в R {data.table}, до v1.8.3?
http://r.789695.n4.nabble.com/Avoiding-print-when-using-tp4643076.html
Часто задаваемые вопросы 2.21 и 2.22 были обновлены.

FAQ 2.21 Почему DT [i, col: = value] возвращает весь DT? Я ожидал либо видимого значения (в соответствии с <-), либо сообщения или возвращаемого значения, содержащего, сколько строк было обновлено. Не очевидно, что данные действительно были обновлены по ссылке.
Это изменилось в v1.8.3, чтобы оправдать ваши ожидания. Пожалуйста, обновите. Весь DT возвращается (теперь невидимо), так что сложный синтаксис может работать; например, DT [i, done: = TRUE] [, sum (done)]. Число обновленных строк возвращается, когда verbosity включен, либо на основе запроса, либо глобально с использованием опций (datatable.verbose = TRUE).

FAQ 2.22 Хорошо, спасибо. Что было так сложно в том, что результат DT [i, col: = value] возвращается невидимо?
R внутренне обеспечивает видимость для [. Значение eval-столбца FunTab (см. Src / main / names.c) для [равно 0 означает силу R_Visible on (см. Раздел R-Internals 1.6). Поэтому, когда мы пробовали невидимый () или сами устанавливали R_Visible на 0, eval в src / main / eval.c снова запустил бы его. Чтобы решить эту проблему, ключ должен был остановить попытку остановить метод печати, выполняемый после: =. Вместо этого внутри: = мы теперь (из v1.8.3) устанавливаем глобальный флаг, который использует метод печати, чтобы знать, действительно ли он печататься или нет.

Этот глобальный флаг – data.table:::.global$print . В верхней части data.table:::print.data.table вы увидите, что он смотрит на нее. Это потому, что нет известного способа подавления печати из [ (как объясняется в FAQ 2.22).

Итак, внутри := внутри [.data.table он смотрит, как «глубокий» этот вызов:

 if (Cstack_info()[["eval_depth"]] <= .global$depthtrigger) { suppPrint = function(x) { .global$print=FALSE; x } # Suppress print when returns ok not on error, bug #2376. # Thanks to: https://stackoverflow.com/a/13606880/403310 # All appropriate returns following this point are # wrapped ie return(suppPrint(x)). } 

Существенно, что это просто говорит: если в приглашении запущен DT[,x:=y] , то я знаю, что REPL собирается вызвать метод print по моему результату, вне моего контроля. Хорошо, поэтому заданный метод print будет запущен, я собираюсь подавить его внутри этого метода print , установив флаг (поскольку метод print который работает (например, print.data.table ), я могу контролировать).

В knitr с knitr REPL умным способом. Это не скрипт, iiuc, иначе DT[,x:=y] по этой причине не будет печататься. Но поскольку он имитирует REPL через eval существует дополнительный уровень глубины eval для запуска кода из knitr . Или что-то похожее (я не знаю, что knitr ).

Вот почему я думаю, что увеличение depthtrigger может сделать трюк.

Хакки / жестокость, я согласен. Но если это data.table , и вы дадите мне знать, какое значение работает, я могу изменить data.table чтобы быть knitr и автоматически изменить значение depthtrigger . Или любые лучшие решения приветствуются.

Почему бы просто не использовать:

 ```{r, results='hide'} DT[, c:=5] ``` 

Для тех, кто возвращается к этому в 2017 году с RMarkdown 1.3 и data.table 1.10 или аналогичным, произошел всплеск этой ошибки, как это определено и описано здесь

Это было впоследствии исправлено в RMarkdown 1.4

Просто окружайте выражение невидимым (). Это работает для меня.

Я столкнулся с одной и той же проблемой, и я решил ее довольно легко, переустановив переменную. В твоем случае:

 DT <- DT[, ':=' (c, 5)] 

Это немного более подробный, особенно, если имя переменной велико.

  • Удаление нескольких столбцов из R data.table с параметром для удаления столбцов
  • Как добавить новый столбец в фреймворк данных (на передний план не заканчивается)?
  • Отобразить точное значение переменной в R
  • объединение двух кадров данных различной длины
  • Анализ Квай-квадратов с использованием для цикла в R
  • Преобразование матрицы данных в матрицу отсутствия присутствия
  • Использование динамических имен столбцов в `data.table`
  • Как удалить выбросы из набора данных
  • Заполнение шаблонов для графиков
  • Как отсортировать вектор символа, где элементы содержат буквы и числа в R?
  • Разница между опциями передачи в aes () и за ее пределами в ggplot2
  • Давайте будем гением компьютера.