语言R中rm()的参数

时间:2016-12-22 09:02:52

标签: r

我是语言R的新手,我发现了一些特别之处。 使用方法rm()时,我想知道为什么我不能将ls()作为参数传递。 使用rm(list = ls())时将传递编译。 方法ls()将返回类型为List的数据,赢了吗? 这是我第一次在国外网站上提问,我的英语很糟糕,对不起!等待你的答案!

1 个答案:

答案 0 :(得分:0)

它与R中的...特殊参数(AKA“点 - 点”或“省略号”)有关。 ...捕获所有未命名的参数(以及未记录的命名参数),“positionnally”。

请参阅?rm的参数:rm(..., list = character(), pos = -1, envir = as.environment(pos), inherits = FALSE)。 由于...是第一个参数,因此它会在ls()中捕获rm(ls())。 但正如您在...的源代码中看到的那样rm存在期望(只需在命令行键入rm):

function (..., list = character(), pos = -1, envir = as.environment(pos), 
  inherits = FALSE) 
{
  dots <- match.call(expand.dots = FALSE)$...
  if (length(dots) && !all(vapply(dots, function(x) is.symbol(x) || 
    is.character(x), NA, USE.NAMES = FALSE))) 
    stop("... must contain names or character strings")
  names <- vapply(dots, as.character, "")
  if (length(names) == 0L) 
    names <- character()
  list <- .Primitive("c")(list, names)
  .Internal(remove(list, envir, inherits))
}

此处is.symbol()失败。

通过示例可能会更容易:

foo <- 1L
bar <- 2L
rm(ls())
# Error
ls()
# [1] "bar" "foo"
rm(c("foo", "bar"))
# Same error
rm("foo", "bar")
# OK

如果您想进一步调查,我建议:debugonce(rm)然后rm(ls())然后逐步执行(在像RStudio这样的IDE中更容易)。