gpt4 book ai didi

r - 为什么当 ... = [.data.table 时,trace(..., edit=TRUE) 不起作用

转载 作者:行者123 更新时间:2023-12-02 07:32:19 25 4
gpt4 key购买 nike

为了临时编辑打包函数 func 的主体,我经常使用 trace(func, edit=TRUE)。但出于某种原因,当 func[.data.table:

时,R 不允许我这样做
## Note: In this and the other cases below, once an editor pops up, I save and 
## and then exit without making any edits to the function. The commented-out
## message below each call to trace() is what is then printed to my R console.

trace("[.data.table", where=data.table, edit=TRUE)
# Error in .makeTracedFunction(def, tracer, exit, at, print, doEdit) :
# the editing in trace() can only change the body of the function, not
# the arguments or defaults

问题:什么可能导致此错误?还有哪些其他函数也会触发它?对于此类函数,是否有一些替代解决方法可以让我编辑它们?

FWIW,这似乎不是 data.table 命名空间中函数的一般问题(参见下面的 #1),也不是问题一般使用子集方法(参见下面的#2)。

## (#1)     
trace("within.data.table", where=data.table, edit=TRUE)
# Tracing function "within.data.table" as seen from package "data.table"
# [1] "within.data.table"

## (#2)
trace("[.Date", edit=TRUE)
# Tracing function "[.Date" in package "base"
# [1] "[.Date"

我在 Windows XP 计算机上运行 R-3.0.0data.table_1.8.8,无论是否使用 set options,都会出现相同的错误(editor="emacs")options(editor="notepad") 或使用 R GUI 的默认编辑器。

最佳答案

这显然是由于最近在 data.table 的正式参数列表中的一个位置添加了花括号(即 {})而引起的。

首先,MRE 表明大括号确实会导致 trace(..., edit=TRUE) 窒息:

## Without braces, no problem
func <- function(inColor=FALSE, col = if(inColor) "red" else "grey") {
plot(rnorm(99), col=col)}

trace(func, edit=TRUE)
# [1] "func"


## With braces, tracing fails
funcB <- function(inColor=FALSE, col = if(inColor) "red" else {"grey"}) {
plot(rnorm(99), col=col)}

trace(funcB, edit=TRUE)
# Error in .makeTracedFunction(def, tracer, exit, at, print, doEdit) :
# the editing in trace() can only change the body of the function, not
# the arguments or defaults

然后,为了记录,这里是版本 1.8.6(跟踪有效)和版本 1.8.8(跟踪无效)中 [.data.table 的形式:

## Version 1.8.6 -- Tracing worked
function (x, i, j, by, keyby, with=TRUE, nomatch=getOption("datatable.nomatch"),
mult="all", roll=FALSE, rolltolast=FALSE,
which=FALSE, .SDcols, verbose=getOption("datatable.verbose"), drop=NULL)


## Version 1.8.8 -- Tracing doesn't (See {} in the 'rollends' argument)
function (x, i, j, by, keyby, with=TRUE, nomatch=getOption("datatable.nomatch"),
mult = "all", roll = FALSE,
rollends = if (roll == "nearest") c(TRUE,
TRUE) else {
if (roll >= 0)
c(FALSE, TRUE)
else c(TRUE, FALSE)
},
which = FALSE, .SDcols, verbose = getOption("datatable.verbose"),
allow.cartesian = getOption("datatable.allow.cartesian"),
drop = NULL, rolltolast = FALSE)

关于r - 为什么当 ... = [.data.table 时,trace(..., edit=TRUE) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com