示例:我有以下代码:
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在下面指出的那样,该函数可以在全局环境中轻松重新定义。
答案 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
内正常运行。