【问题标题】:Writing a shortcut function in R for rm(list=ls()) [duplicate]在 R 中为 rm(list=ls()) 编写快捷函数 [重复]
【发布时间】:2014-02-12 04:31:59
【问题描述】:

我正处于学习 R 的早期阶段,并认为这将是一个足够简单的练习。想编写一个快捷函数来从工作区中删除所有变量。我尝试了以下方法(最初使用打印语句测试它是否正在运行):

clr<-function(x){ 
  rm(list = ls()) 
  #sprintf('this works')
}

但在我获取代码并运行命令“clr()”(当然,不带引号)之后,上述内容没有任何作用。

我需要指定环境(env = globalenv())吗?我试过这个但无济于事。

提前致谢!

【问题讨论】:

  • 学习不要在 R 开始的目录中保存 .Rdata 工作区可能是一个好主意
  • 我总是将目录更改为我的 R 文件所在的目录。这是你说我应该做的吗?
  • @mdsumner,我很欣赏Clearing Workspace in R 的其他解释,但是我喜欢下面的解决方案如何避免删除对象函数本身。
  • 如果您在包含 hidden .Rdata 文件的文件夹中启动 R,R 的默认设置是加载它。 rm(list = ls()) 是一个讨厌的病毒,应该用完整的解释来代替。这很烦人,会减慢您的启动速度,并可能隐藏其他令人讨厌的惊喜。

标签: r list function


【解决方案1】:

您的函数有两个与环境相关的问题:ls()rm() 都在当前环境中工作,这将是函数clr() 的执行框架。

换句话说,ls() 将为您提供clr() 框架中可用的对象,这在您的函数的情况下是没有的(调试它并查看在执行框架中ls() 返回什么clr())。因此,您要求 rm() 删除任何内容。

一旦你解决了这个问题,你仍然需要告诉rm() 要从哪个环境中移除对象。在这里你又犯了一个错误; rm() 的第一个参数是 ...,这意味着您需要将 rm() 的参数完全命名为 ... 参数之后。你想要的参数是envir 而不是env

这是一个执行您想要的功能的函数,而且它不会自行删除 (!)。

clr <- function() {
  ENV <- globalenv()
  ll <- ls(envir = ENV)
  ll <- ll[ll != "clr"]
  rm(list = ll, envir = ENV)
}

我们在使用中

> ls()
[1] "clr"  "obj1" "obj2"
> clr()
> ls()
[1] "clr"

请注意,正如所写,这不会删除隐藏对象(那些以. 作为其名称的第一个字符的对象)。为此,您需要使用ls(all.names = TRUE)

最后一句话,但在clr() 的定义中不需要参数x;没有参数的函数很好。

【讨论】:

  • 我在这里的回答中使用了. 方法来命名函数:stackoverflow.com/a/20389913/1270695
  • 非常感谢,这很有意义。在R中,是否有一个在打开R时运行的启动文件,以便我每次使用R时都不必来源该函数所在的文件?
  • @AnandaMahto 我考虑用. 命名函数来隐藏它,但后来意识到如果你也想删除隐藏的对象,它仍然会被清理。我认为除了将其打包并像任何其他 R 包一样加载或将attach() 函数加载到搜索路径之外,没有一个巧妙的解决方案,那么工作区中的那个是否得到并不重要已删除。
  • @NicoleGoebel 是的,有几个取决于您的操作系统、安装方式以及您拥有的管理员权限。见?Startup。另一个更可取的选择是将这个和您可能编写的任何其他有用函数放入个人 R 包中,然后使用?Startup 中提到的方法/文件加载该包。
  • 谢谢@GavinSimpson,我会看看启动帮助并从那里开始。我已经把这个函数放到了一个文件中,我希望添加其他“快捷方式”。开始真正喜欢 R,我学的越多!
【解决方案2】:

我认为这是错误的问题rm(list = ls(...))construct 只是一个讨厌的病毒,通过在用户之间复制的代码进行传播。

这个结构有什么需要?

  • 整洁的工作空间
  • 减少内存使用
  • 简化依赖网络(rm 无济于事)

为什么 R 的设计者一开始就不提供一个干净的工作空间?他们这样做了,它只是被滥用了,Windows 的默认行为以无益的方式隐藏了细节。

为什么启动 R 时工作区不干净?

当 R 启动时,它总是与“当前目录”一起工作,就像在“文件夹中”一样,如果您要求“file1.iaf”,则不需要显式指向“C:/临时/myfolderofiafs/file1.iaf”。

在 unix 中,这就是您键入时所在的位置

R

而且你输入的时候就可以直接看到

pwd

在 Windows 中,在命令行中也是如此(将 pwd 替换为 dir 并查找“...的目录”),但是当您“(双击)R 快捷方式”时,系统会为您执行相同的操作,但它从哪里开始由快捷方式的“属性”控制。您可以通过右键单击快捷方式来查看此内容,单击“属性”并查看“开始于”字段的内容。 (它可能是一个系统通配符,如 %HOMEPATH% 或其他,但它可能代表“C:/Users/username/Documents”。)

  1. R 默认从 your 文件夹之一开始,因为它是唯一可以真正知道有权做事的地方。

  2. 我使用的是 Windows 8,这在 Windows 3.1、95、98、NT、CE、2000、XP、Vista 和 7 上略有不同,但涵盖了所有可以留给 google 的内容。

查看“开始于”文件夹,您可能看不到名为“.Rdata”的文件,但那是因为它被隐藏了。启动 R,并在执行任何其他操作之前运行以下代码:

list.files(all = TRUE)

是否有“.Rdata”文件? (您可以在命令行中使用“dir /a”查看它,或者在 unix 中使用“ls -a”查看。)

当您启动 R 时,默认情况下会加载该文件,就像您执行了以下操作一样:

load(".Rdata")

这就是工作区“需要清理”的原因,但在我看来,您应该删除那个“.Rdata”文件并摆脱工作流程中的笨拙黑客。

你可以从 R 中解决这个问题,这样做:

unlink(".Rdata")

当你退出 R 时,选择“否”,这样这个隐藏文件就不会再次被重新创建。如果您不小心创建了它,请追捕并再次杀死它。

如果您真的想保存整个工作区,请使用:

save.image("myentireworkspaceorperhapssomesensiblefilenameforit.Rdata")

或者只是其中的几个对象:

save(keepme, keepme2, andme, file = "justsomeofmyclingyobjects.Rdata")

您可以通过设置文件夹的视图属性来查看 Windows 本身中隐藏的“.Rdata”文件(这是 Windows 8,我通过“查看/选项'更改文件夹和搜索选项'”访问它):

选择“显示隐藏的文件、文件夹和驱动器”。我还强烈建议您取消单击“隐藏已知文件类型的扩展名”,因为扩展名确实是文件名的一部分,而隐藏它有时只会混淆一切。 (如果您尝试在没有此设置的情况下将文件从“file.txt”重命名为“file.R”,Windows 默认会将文件的真实名称设为“file.R.txt”)。

还有更多,在快捷方式属性的“目标”字段中,您可以添加参数,例如“--no-restore”或“--no-restore-data”。

这也将“解决”上述最终问题,但不是以正确的方式 IMO。

这些参数在命令行中可用(在 Windows 上):

Rgui --help

但您需要使用完整路径或在路径中包含 R 的 bin/* 文件夹才能正常工作。请参阅?Startup 进行更全面的讨论,

【讨论】:

  • 这似乎有点过头了,包括狩猎和杀戮等等 :) 但我认为这只是因为我没有遇到所描述的问题。我使用rm(list=ls()) 是因为我已经有一个会话正在运行,并且想确保我的脚本可以自己运行,而没有我一直在交互定义的东西(而不是因为我双击了 R 图标并碰到了.RData )。我几乎通过双击“name.RData”或使用会话 nppToR spawns 来运行 R。
  • 好的,等我有目标的时候再保存。
  • 感谢 mdsumner。我会看看你提到的事情,以便正确理解 R 在启动时正在做什么。出于与@Frank 相同的原因,我喜欢“清理我的工作区”。但也许我将来会遇到你提到的问题。非常感谢您提供的所有信息!
猜你喜欢
  • 2018-04-08
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2011-04-01
  • 1970-01-01
  • 2017-03-06
  • 2016-11-17
相关资源
最近更新 更多