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