Вывод данных в зависимости от платформы

Чтобы помочь себе с отображением отладочной информации, я решил создать следующую крошечную функцию, которая динамически переключалась бы между отображением данных во внутреннем браузере данных RStudio и простым символьным выводом, в зависимости от возможностей. платформы, откуда берутся мои модули:

View <- function (...) {
  if (.Platform$GUI == "RStudio")
    View(...)
  else
    print(...)
}

Эта функция находится вместе с другими служебными функциями в модуле <PROJ_HOME>/utils/debug.R. Все модули, которым нужны эти функции, подключайте через source("../utils/debug.R").

Запуск кода моего проекта на консоли Linux инстанса Amazon EC2 работает нормально. Однако запуск его на той же виртуальной машине через RStudio Server приводит к следующему сообщению об ошибке:

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

Мне кажется, что R запутался в том, какую функцию View() нужно вызывать. Первоначально я предположил, что RStudio перегружает utils::View(), и попытался вызвать его явно, но это не удалось. Тогда я подумал, что RStudio каким-то образом определяет свою View() реализацию в глобальном окружении, так что ее просто нужно называть View() без ссылки на пакет/библиотеку. Однако, как я вижу, это тоже не работает. Другая потенциальная причина ошибки может заключаться в том, что я переоценил «умность» R с точки зрения использования ... аргументов.

Итак, что не так и как это исправить?


person Aleksandr Blekh    schedule 06.03.2014    source источник
comment
Как насчет явного вызова utils::View(...) в вашей функции?   -  person Karl Forner    schedule 06.03.2014
comment
@KarlForner: только что обнаружил ваш комментарий. Я пробовал utils::View(...) вызывать, но это приводит к следующей ошибке и предупреждению: "Error in .External2(C_dataviewer, x, title) : invalid device In addition: Warning message: In utils::View(...) : unable to open display". Это запускает мой код в RStudio Server.   -  person Aleksandr Blekh    schedule 11.03.2014


Ответы (1)


RStudio перехватывает функцию View. Один из подходов может заключаться в том, чтобы посмотреть, не переопределил ли кто-нибудь функцию View из utils, и вызвать переопределение, если оно существует. Что насчет этого?

View <- if (identical(utils::View, View)) print else View
person Jonathan    schedule 11.03.2014
comment
Спасибо за предложение, Джонатан! Однако ваш подход приводит к той же ошибке и предупреждению, что и в моем комментарии Карлу выше. - person Aleksandr Blekh; 11.03.2014
comment
Джонатан, пожалуйста, не обращайте внимания на мой предыдущий комментарий - я понял, что тестировал ваши изменения, не очищая среду R (рабочее пространство). Когда я протестировал ваш код после правильной очистки рабочей области, он хорошо работает на обеих платформах, как я и планировал. Отличная работа! Еще раз спасибо! Ответ принят! Итак, из вашего ответа я делаю вывод, что R позволяет переопределять функции с опусканием (...) синтаксиса аргументов. Правильный? Я был бы признателен, если бы вы ознакомились с моими недавними вопросами R по адресу: stackoverflow.com/users. /2872891/. - person Aleksandr Blekh; 11.03.2014
comment
Мне все еще интересно, почему мой оригинальный подход вызывает ошибку рекурсии, а ваш (по сути, очень похожий) код не... - person Aleksandr Blekh; 11.03.2014
comment
Ваш оригинальный подход создает функцию, которая вызывает View. R разрешает имена функций в момент их запуска. - person Jonathan; 11.03.2014
comment
Модифицированный подход работает, потому что он копирует функции, а не оборачивает их. Копирование происходит до присваивания View, поэтому внутри присваивания View ссылается на его более раннее определение. - person Jonathan; 11.03.2014
comment
Одной из наиболее запутанных функций R является возможность иметь несколько разных переменных с одинаковыми именами, присутствующих в разных средах. Чтобы понять, на какую функцию/переменную ссылаются во время выполнения, полезно посмотреть на привязки среды, если вы еще уже: adv-r.had.co.nz/Environments.html - person Jonathan; 11.03.2014
comment
Спасибо за четкое объяснение! Я немного знал о средах R, но не в контексте функций. Узнавайте что-то новое о R каждый день... - person Aleksandr Blekh; 12.03.2014