【问题标题】:Why doesn't rm(ls()) work and "list" is needed?为什么 rm(ls()) 不起作用并且需要“列表”?
【发布时间】:2015-09-18 17:25:32
【问题描述】:

我刚开始在“datacamp”网站上学习 R,一开始我遇到了语法误解。

它说rm(list = ls()) 是一个非常有用的命令,可以清除工作区中的所有内容,但我不明白list = 的用途。

  • 一个。他们还没有教我 R 中= 的含义,我也没有在文档中找到解释。 = 就像 <-?有什么不同?

  • b.如果rm() 的输入可以是变量名列表,ls() 的输出是变量名列表,那我为什么不能直接使用rm(ls())?

【问题讨论】:

  • 执行help(rm) 以查看rm 采用哪些参数。 list 是参数之一的名称。您可以按位置和/或使用显式名称向函数提供参数。这里显式命名的原因是函数参数列表以...开头。如果您没有按名称指定命名参数之一,rm 不知道您的意图,因为您可以在同一个调用中使用rm 删除环境中任意数量的单个对象。这是您唯一应该使用= 的时间(IMO)是在执行函数参数分配时。
  • 简答,ls() 有引号(是一个字符向量),help(rm) 中的 ... 参数表示它只接受不带引号的名称
  • 这不是一个坏问题。忽略不赞成票。

标签: r syntax


【解决方案1】:

按位置与名称传递参数

= 符号在命名函数调用的参数方面起着特殊作用。

考虑两个基本相同的函数:

f <- function(..., y=3) (2+sum(...))^y
g <- function(y=3, ...) (2+sum(...))^y

如果y=没有被命名,结果一般是不同的:

f(y=5) # 32
g(y=5) # 32

f(5)   # 343
g(5)   # 32

rm 就像f -- 输入?rm 来查看 -- 所以如果你想打电话给rm(list = ls()),请完整地写出来。

表示对象名称

在大多数 R 语言中,如果你写 f(g()),评估自然会进行:

  • g() 被评估为 8 并替换为 f(g()) 为 f(8)
  • f(8) 被评估为 1000

rm 在其未命名的... 参数中打破了这种模式,这些参数基本上只是为了交互使用而存在。只允许手动输入变量名。†因此,rm(ls()) 将无法运行。

哈德利·威克姆provides another nice example:

ggplot2 <- "plyr"
library(ggplot2) # loads ggplot2, not plyr!

†​​ 好的,您可以使用 ... 而不需要手动输入名称,例如

do.call(library, as.list(ggplot2)) # loads plyr!

但除非你知道自己在做什么,否则不要乱用它。

【讨论】:

  • 但还要注意,如果您在工作区中有X 和Y,则使用rm(),您可以 执行rm("X", "Y"),但您不能 做rm(ls())。这就是我难以理解的内容。
  • @RichardScriven 是啊,即使只有x,比如rm(list=ls()); x=1,你也不能这样做rm(ls())...我正在努力想一些其他评估异常的例子规则。哦,这是一个:mylib = "data.table"; library(mylib) # error。我猜它在旧的基本函数和 hadleyverse 中最为普遍。
  • 所以,内部发生了一些事情,这使得rm(ls()) 不可能。请注意,.Internal(remove(ls(), .GlobalEnv, FALSE)) 确实有效,rm() 在最后调用它(对于基本情况)。
猜你喜欢
  • 2018-04-08
  • 2019-03-13
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多