2017-01-08 6 views
2

Я использую RStudio и хочу определить метод View для специально классифицированного data.frame, но сохраняю существующий метод View для стандартного объекта data.frame/matrix.Как я могу перегрузить функцию просмотра RStudio для пользовательских фреймов данных?

RStudio по умолчанию:

  • data.frame или матрица объектов открыть в текстовом браузере, в панели источников, при использовании View(x) или при нажатии на объект в области окружающей среды.

Когда я пытаюсь переопределить методы, используя этот код, я получаю приведенное ниже поведение. Мой специально классифицированный объект просматривает то, что я хочу, но стандартные объекты data.frame больше не вызывают браузер типа таблицы в области «Источник».

Как добавить новое поведение View() для моего объекта, но сохраните также оригинальное поведение?

iris_myclass <- iris 
class(iris_myclass) <- c("myclass", "data.frame") 

View(iris) 
## opens a tabular data browser in the Source pane 
View(iris_myclass) 
## opens a tabular data browser in the Source pane 

View <- function(x, title) { 
    UseMethod("View") 
} 

View.default <- function(x, title) { 
    utils::View(x, title) 
} 

View.myclass <- function(x, title) { 
    DT::datatable(x) 
} 

View(iris) 
## opens an Xwindows Viewer 
View(iris_myclass) 
## opens an HTML datatable browser in the Viewer pane 

Мои настройки: RStudio версии 1.0.136 и

R version 3.3.2 (2016-10-31) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: macOS Sierra 10.12.2 

locale: 
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] DT_0.2 

ответ

0

Это делает работу, как это:

View.default <- function(x, title) { 
    mget('View', as.environment('package:utils'))[[1]](x) 
} 

utils::View и mget('View') возвратные различные функции. Как объясняет @KevinUshey, Rstudio переопределяет View на пути поиска (в среде package:utils), но не в пространстве имен utils. Поэтому у нас нет доступа к utils::View, но мы могут с mget.

+0

Спасибо, что работает! Есть ли способ сделать это * без * переопределения общего? Так что, когда мой пакет подключен, я не получаю предупреждения NAMESPACE с помощью 'utils :: View', после переопределения объекта как общего? –

+0

Обратите внимание, что исходный 'View' не является общим, отправка не производится, он просто коэрцирует все на data.frame. Не уверен, что делать с конфликтом имени. – Axeman

+1

Совершенно верно, я должен был сказать: «без переопределения« Просмотр »как общего». ('sample' - это другая функция, которую я должен переопределить как общий в моем пакете, что создает еще одну заметку о конфликте для пользователей, которую они находят страшной, но не имеет никакого эффекта, поскольку методы' .default' называет ранее существовавшие не общие.) –