Есть ли способ изменить способ просмотра для разных классов? - PullRequest
0 голосов
/ 13 января 2020

Я создал класс S3 в R, основанный на списке. Однако я хочу, чтобы он отображался в представлении, как если бы это был фрейм данных. По сути, я хочу, чтобы View использовал метод as.data.frame для просмотра, а не для отображения в виде списков. Есть ли способ сделать это?

Вот тривиальный пример:

as.myclass <- function(x) {
  x <- list(x = x, y = 1, z = 2)
  class(x) <- "myclass"
  return(x)
}

as.data.frame.myclass <- function(x) {
  return(x$x)
}

View(as.myclass(mtcars))                      # This is what it does
View(as.data.frame(as.myclass(mtcars)))       # This is what I would like the previous command to do

1 Ответ

2 голосов
/ 13 января 2020

Если мы определим метод, as.data.frame.myclass View() будет работать ... если только вы не используете Rstudio, который имеет свою собственную версию, которая имеет приоритет и ведет себя по-другому.

Если вы используете utils::View(), вы получите вывод R gui:

as.myclass <- function(x) {
  class(x) <- "myclass"
  return(x)
}

as.data.frame.myclass <- as.data.frame.list
utils::View(as.myclass(mtcars)) 

Теперь, если вы используете Rstudio, это будет немного сложнее, нам нужно переопределить и сделайте его обобщенным c:

View <- function(x, title) UseMethod("View")
View.default <- function(x, title) eval(substitute(
  get("View", envir = as.environment("package:utils"))(x,title)))
View.myclass <- function(x, title) eval(substitute(
  get("View", envir = as.environment("package:utils"))(as.data.frame(x),title)))
View(as.myclass(mtcars))   

Было бы проще, если бы вы могли позволить себе сохранить класс data.frame вместе с myclass:

as.myclass <- function(x) {
  class(x) <- c("data.frame","myclass")
  return(x)
}
View(as.myclass(mtcars)) # without overriding `View()`!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...