拆包...在R

时间:2015-07-27 21:28:55

标签: r

感到沮丧,无法解决这个问题:

在我正在进行的在线课程中,代码示例如下:

add_alpha_and_beta <- function(...){

    args <- list(...)
    print(args)

     alpha <- args[["alpha"]]
     beta  <- args[["beta"]]

     alpha + beta 
  }

这是为了获取包含2个命名值alpha和beta的列表,并将它们一起添加。简单。

然而,我得到的输出是:

[[1]]
alpha  beta 
    1     2 

numeric(0)

有谁能告诉我发生了什么?

2 个答案:

答案 0 :(得分:3)

您似乎以listvector为唯一参数调用该函数:

add_alpha_and_beta(list(alpha = 2, beta = 3))
add_alpha_and_beta(c(alpha = 2, beta = 3))

如果是这样,你可以通过查看...的第一项来解压缩它:

args = list(...)[[1]]

当调用没有列表但直接使用单独(命名)参数的函数时,您的函数就像宣传的那样工作。

答案 1 :(得分:2)

我明白你一定要做的事情:

add_alpha_and_beta(list(alpha = 1, beta = 2))

即。您传递的是包含2个组件的单个列表,alphabeta。代码没有考虑到这一点。

编写函数的方式,它希望您将其称为:

add_alpha_and_beta(alpha = 1, beta = 2)

然后,在内部,您可以捕获列表中的...,其名称等于您调用该函数的键值对中的键名称。

当你调用这样的函数时:

add_alpha_and_beta(list(alpha = 1, beta = 2))
你正在传递一个论点。 args然后是一个列表,其中包含一个包含两个组件的列表:

Browse[2]> args
[[1]]
[[1]]$alpha
[1] 1

[[1]]$beta
[1] 2

由于这些内容直接编入args[["component"]],因此这两者都会返回NULL

Browse[2]> args[["alpha"]]
NULL

NULL + NULL是零长度数字:

Browse[2]> NULL + NULL
numeric(0)

你看到的是什么。

如果没有看到实际的问题/文字,就无法说明需要什么,但如果这是给定的代码,那么你必须以课程老师预期和预期的方式调用它。我将补充说,以这种形式编写和使用R函数是最自然的

add_alpha_and_beta(alpha = 1, beta = 2)

而不是你调用函数的方式。但是如果你想这样做,你需要添加一些索引来进入第一个嵌套列表:

args <- list(...)[[1L]]
例如,

会起作用,但这会破坏更自然的用法。你会使代码复杂化以处理两者:

args <- list(...)
if (length(args) == 1L) {
  args <- args[[1L]]
  ## probably some error checking code here
}
....