R:以编程方式为函数分配测试

时间:2011-09-07 07:15:50

标签: r language-design

我正在扩展doSvUnit.R脚本,以便在其报告中包含示例。

任务的一个初始步骤是将测试与函数相关联,其中函数的名称在变量中。 (我的真实测试函数不只是checkTrue,而是调用名为funcName的函数的示例。我只是在这里展示这个概念。)

> funcName <- "double.threshold"
> test(get(funcName)) <- function() checkTrue(TRUE)
Error in test(get(funcName)) <- function() checkTrue(TRUE) : 
  could not find function "get<-"
>

甚至

> test(get("double.threshold")) <- function() checkTrue(TRUE)
Error in test(get("double.threshold")) <- function() checkTrue(TRUE) : 
  target of assignment expands to non-language object
>

我不明白错误消息背后的原因,我不明白为什么我得到两个不同的错误消息,我认为是同样的事情。

感谢第二条错误消息,我通过将函数存储在一个对象中找到了workaround,但我不明白为什么它应该是必要的而且我不确定这是否特定于{{3 }}

> f <- get(funcName)
> test(f) <- function() checkTrue(TRUE)
> 

2 个答案:

答案 0 :(得分:1)

R语言参考的

Section3.4.4解释了(子)分配的工作原理。

特别是names上的示例显示了R如何使用嵌套函数调用(在左侧)和赋值来解释语句。

基本上(过于简单化,但对于大多数情况来说足够精确),它表明它需要左侧每个函数的赋值版本。

请注意,在不同情况下,这些相同的问题会让很多人感到不安:请参阅this great answer by Gavin Simpson我自己的一个问题,这会让我看到幕后发生的事情。

答案 1 :(得分:0)

我也怀疑它是特定于svUnit的。它告诉你解析器正在寻找get<-函数并且找不到它。

> ttt <- function(x) x+2
> fname <- "ttt"
> body(ttt ) <- quote(x+4)
> ttt
function (x) 
x + 4

该操作成功但是这个操作没有:

> body(get(fname) ) <- quote(x+4)
Error in body(get(fname)) <- quote(x + 4) : 
  could not find function "get<-"