动态重新定义print.data.frame之类的函数

时间:2015-07-29 14:19:06

标签: r

  1. 有没有办法重新定义锁定功能?
  2. 在评估某些代码时动态重新定义这样一个全局可用函数的最佳方法是什么?
  3. 示例:我有以下代码:

    print(cars[1:5, ])
    

    这通常会调用print.data.frame,但无论出于何种原因,我都希望它调用my.fancy.print.data.frame()。实现这一目标的最佳方法是什么?

    最后,我想有这样的事情:

    evalWithEnvir(print(cars[1:5, ]), envir = list(print.data.frame = my.fancy.print.data.frame))
    

    编辑: 问题很严重。问题是我使用<<-来重新定义函数。这试图在错误的环境中设置功能。正如@hrbrmstr在下面指出的那样,该函数可以在全局环境中轻松重新定义。

2 个答案:

答案 0 :(得分:3)

您可以使用以下命令重新定义环境中print.data.frame的功能:

print.data.frame <- function(x, ..., digits = NULL,
      quote = FALSE, right = TRUE, row.names = TRUE) {
  print("WOO HOO")
}

现在无用因为它只会打印WOO HOO vs做一些有意义的事情,但它应该会帮助你开始。

SabDeM的想法更好:

class(mtcars) <- c("myclass", class(mtcars))

print.myclass <- function(x) {
  print(ls.str(x))
}

print(mtcars)

## am :  num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
## carb :  num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
## cyl :  num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
## disp :  num [1:32] 160 160 108 258 360 ...
## drat :  num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## gear :  num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
## hp :  num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
## mpg :  num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## qsec :  num [1:32] 16.5 17 18.6 19.4 17 ...
## vs :  num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
## wt :  num [1:32] 2.62 2.88 2.32 3.21 3.44 ...

答案 1 :(得分:3)

print.data.frame未被锁定&#39; (或隐藏)。它出现在methods("print")中,其中也给出了不可见的方法。

如果您不想定义特殊class,则可以在定义的环境中覆盖base::print.data.frame并在代码中引用它,例如

e1 <- new.env(parent=.GlobalEnv)
assign("print.data.frame",
       function(x) print((unclass(x))),
       envir=e1)
with(e1, print(cars[1:5, ]))

,并提供:

$speed
[1] 4 4 7 7 8

$dist
[1]  2 10  4 22 16

attr(,"row.names")
[1] 1 2 3 4 5

并且您的其他代码应该在e1内正常运行。