感到沮丧,无法解决这个问题:
在我正在进行的在线课程中,代码示例如下:
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)
有谁能告诉我发生了什么?
答案 0 :(得分:3)
您似乎以list
或vector
为唯一参数调用该函数:
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个组件的单个列表,alpha
和beta
。代码没有考虑到这一点。
编写函数的方式,它希望您将其称为:
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
}
....