如何为自定义数据帧重载RStudio的View函数?

时间:2017-01-08 11:42:04

标签: r rstudio

我正在使用RStudio并希望为特殊的data.frame定义一个View方法,但仍然保留现有的View方法用于标准的data.frame / matrix对象。

RStudio默认值:

  • 使用View(x)或单击“环境”窗格中的对象时,在“表格”浏览器中的“源”窗格中打开data.frame或矩阵对象。

当我尝试使用此代码重新定义方法时,我得到下面指出的行为。我的特殊对象以我想要的方式查看,但标准data.frame对象不再在Source窗格中调用电子表格类型的浏览器。

如何为我的对象添加新的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

1 个答案:

答案 0 :(得分:1)

它确实像这样工作:

View.default <- function(...) {
  get('View', as.environment('package:utils'))(...)
}

utils::Viewmget('View')返回不同的功能。正如@KevinUshey所解释的那样,Rstudio会覆盖搜索路径上的Viewpackage:utils环境中),但不会覆盖utils命名空间中的utils::View。我们无法使用mget访问它,但我们可以 get

使用mget代替 int chosenImageNumber = (int) (Math.random() * images.length()); 甚至更好一些(感谢@Willem)。