获取“一旦删除”调用函数的参数类

时间:2018-11-04 01:37:23

标签: r

这是一个“对语言进行计算”的问题,我的技能充其量只是充其量。我正在编写一个函数来检查输入参数的类。这是函数:

chkArgs <- function() {

    # Get args of the function that called this function
    # stackoverflow.com/q/17256834/633251
    args <- as.list(match.call(definition = sys.function(-1),
        call = sys.call(-1)))[-1]

    print(data.frame(cls = unlist(lapply(args, class)))) # for debugging only

    if (class(eval(args[["x"]])) != "integer")
        stop ("Argument 'x' was not an integer or not found")
    if (class(eval(args[["y"]])) != "integer")
        stop ("Argument 'y' was not an integer or not found")
}

使用以下测试功能,该功能可以正常工作:

testFunc <- function(x = 1L, y = 1L){ chkArgs(); x + y }

和这些电话:

testFunc(1L, 1L)
testFunc(3.0, 1L)
testFunc(x = 8L)

现在,如果我们间接调用chkArgs或“一次删除”,如下所示:

testFunc2 <- function(x = 1L, y = 1L){
    chkArgs()
    testFunc(x, y) # also calls chkArg
}

testFunc2(1L, 1L)

我们得到以下输出:

> testFunc2(1L, 1L)
      cls
x integer
y integer
   cls
x name
y name
Error in eval(args[["x"]]) : object 'x' not found

如何让chkArgs间接工作?

1 个答案:

答案 0 :(得分:2)

您可以使用以下方法来解析父函数n的形式参数:

fargs <- function(n) { mget(names(formals(sys.function(n))), sys.frame(n), inherits=TRUE); }

因此您的chkArgs可以被写

chkArgs <- function() {

    args <- fargs(-2);  # 2 because the helper function fargs is yet another level down

    if (class(args$x) != "integer")
        stop ("Argument 'x' was not an integer or not found")
    if (class(args$y) != "integer")
        stop ("Argument 'y' was not an integer or not found")

    return(args);
}

这两种情况现在都可以检出。

最初写的主要问题似乎是内部检查仅将xy视为符号,因为这就是它们在eval的直接环境中的含义。将mgetinherits一起使用将搜索帧,直到解析出一个值为止。