Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:线性码链的丰富调试_R_Debugging_Rstudio_Metaprogramming_Reverse Debugging - Fatal编程技术网

R:线性码链的丰富调试

R:线性码链的丰富调试,r,debugging,rstudio,metaprogramming,reverse-debugging,R,Debugging,Rstudio,Metaprogramming,Reverse Debugging,我试图弄清楚,在进行大量编程的情况下,是否有可能通过使用R的元编程特性来创建某个调试函数 假设我有一个代码块,这样每一行都使用前一行的输出作为其全部或部分输入-这种代码可能是使用管道生成的,尽管这里没有使用管道 { f1(args1) -> out1 f2(out1, args2) -> out2 f3(out2, args3) -> out3 ... fn(out<n-1>, args&

我试图弄清楚,在进行大量编程的情况下,是否有可能通过使用R的元编程特性来创建某个调试函数

假设我有一个代码块,这样每一行都使用前一行的输出作为其全部或部分输入-这种代码可能是使用管道生成的,尽管这里没有使用管道

{
f1(args1)                  -> out1
f2(out1, args2)            -> out2
f3(out2, args3)            -> out3
...
fn(out<n-1>, args<n>)      -> out<n>
}
其中,foo_foo是在f1的调用环境中定义的对象

我想要一个可以围绕我的代码块的函数,它可以为每一行代码在列表中创建一个条目。每个条目将命名为line1、line2,并且每个行条目都有一个子条目用于每个参数和函数输出。参数条目首先由实际参数所匹配的形式名称组成,第二,如果有表达式或名称,则由提供给该参数的表达式或名称组成,如果该参数只是一个常量,则由占位符组成,第三,则由该表达式的值组成,就好像它是在进入函数时立即被强制的一样。我宁愿从承诺第一次兑现的那一刻起就拥有价值,但在我看来,这似乎是一个更难的问题,而且这两个价值通常是相同的

分配给。。。如果有,将进入dots=list子列表,如果条目有名称,并适当标记为..1,..2,等等,则条目将被命名,如果它们是按位置分配的。每个行子列表的最后一个元素是输出的名称及其值

这一点是为了创建一个相当完整的代码块操作记录。我认为这类似于purrr::Safety的详细版本,它不局限于迭代,并保留每个步骤的更详细记录,事实上,如果函数存在错误,您希望在列表项中显示错误消息以及在产生错误之前可能存在的许多匹配参数

在我看来,这对于调试这样的线性代码非常有用。这使您可以仅使用RStudio调试器来执行困难的操作。例如,它允许您向后跟踪代码。我可能不知道out2中的值是不正确的,直到我看到一些以后的输出。单步执行不会保留中间值,除非插入一堆额外的代码。此外,这还保留了跟踪承诺创建之前发生的匹配错误所需的信息。当您通过单步执行看到这些错误导致的输出时,匹配信息可能已经消失

实际上,我已经编写了一段代码,它采用了管道函数,并消除了管道,将其放入这种格式,只需使用文本操作。事实上,正是约翰·蒙特的Bizarro烟斗让我想到了这一点。如果我,我们,或者你,能想出如何做到这一点,我希望在第二个版本上进行认真的运行,每个函数调用下一个函数,在内部而不是外部为它提供参数-就像一个回溯,在那里你可以得到传递的参数值以及函数名和形式。其他语言也有类似的调试环境,例如GDB,我希望R至少有一个这样的环境已经5年了,也许10年了,这似乎是朝着这个方向迈出的一步。

只需为要跟踪的每个函数发出显示的跟踪

f <- function(x, y) {
  z <- x + y
  z
}
trace(f, exit = quote(print(returnValue())))
f(1,2)

你能解释一下为什么这上面有标签吗?您是否希望此路径特定于IDE?虽然有些东西是为IDE设计的,而不是没有IDE时的语言,但是,我认为这仅仅是R。
f <- function(x, y) {
  z <- x + y
  z
}
trace(f, exit = quote(print(returnValue())))
f(1,2)
Tracing f(1, 2) on exit 
[1] 3
[1] 3