为什么我会收到“无效类型闭包”的错误?

10
W <- ecdf(c(1,2,3))
W
O <- sum(W)
W

为什么这不起作用?我得到了
Error in sum(W) : invalid 'type' (closure) of argument

由于我还比较新手,所以对其他类似帖子的答案并没有完全理解。我该如何修复它?



1
就像错误信息所说的那样:W对象是一个函数(带有附加环境,保存了您传递给它的值)。如果您向R函数提供一些值,它将返回值。这就是R的工作方式。由于您没有说明您的期望,因此进一步的评论将是推测性的。 - IRTFM
w是一个函数吗?我该如何存储来自函数w的值,以计算其元素的总和? - JoeDoe
1个回答

6
ecdf 函数实际上是一个函数式的,也就是说,它的值是另外一个函数。在 R 语言中,我们所谓的“函数”实际上是“闭包”。它们有一个主体,即代码块,可以通过键入函数名来轻松查看。但是,它们还有一个“环境”,其中包含在闭包创建时定义的变量的本地值。
如果您不想为 W 提供与其创建时使用的原始值不同的新值,则需要使用 environment 函数从环境中提取在调用 ecdf 时存在(并创建)的值。 ls 函数将返回该环境的内容名称。
 str(W)
#--------
function (v)  
 - attr(*, "class")= chr [1:3] "ecdf" "stepfun" "function"
 - attr(*, "call")= language ecdf(1:11)
#---------------
 # Just asking to see that environment is less than satisfying
  environment(W)
 #<environment: 0x3cd392588>
 # using `ls` is more informative
 ls( environment(W) )
#[1] "f"      "method" "nobs"   "x"      "y"      "yleft"  "yright"

为了得到原始x值的总和:
> sum( environment(W)$x )
[1] 6

使用as.list将一个环境强制转换为数据对象,可以显示整个环境的内容:

> as.list(environment(W))
$nobs
[1] 3

$x
[1] 1 3 5

$y
[1] 0.3333333 0.6666667 1.0000000

$method
[1] 2

$yleft
[1] 0

$yright
[1] 1

$f
[1] 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接