【问题标题】:Is it feasible to narrow down the result returned by ls() with grep in R, much like the `ls -l | grep` command in UNIX?在 R 中使用 grep 缩小 ls() 返回的结果是否可行,就像 `ls -l | UNIX 中的 grep` 命令?
【发布时间】:2014-05-23 18:49:01
【问题描述】:

在终端/shell脚本中,您可以使用ls -l列出当前目录中的所有文件,然后通过管道将其执行附加命令。例如,ls -l | grep -i "calc" 返回文件名中包含calc 的所有文件。在 R 中,您可以使用 ls() 命令列出当前存储在工作区中的所有对象。

但是,我想缩小 ls() 返回的列表,使用 R 中的 grep 功能,其中输入是 ls() 返回的列表,输出是 grep 缩小的列表(或某些东西),很像我上面提到的 UNIX 管道功能。在 R 中是否可行?

另外,在 R 中通过类似xargs 的功能来缩小列表是否也可行?所以我想只获取文字包含if 的对象,这样如果ls() 返回的列表中的函数在其中包含if-else 条件,我想在控制台中显示该函数。您可以在终端中使用find . | xargs grep "if" 进行操作(当然,这些是当前目录中的文件,而不是工作区中的 R 对象,但我展示它只是为了说明的目的)。

请注意,这不是关于如何从 R 中调用 shell 命令的帖子。这不是我想要做的。

我使用 OS X 10.9.3 和 R 3.1.0。

【问题讨论】:

  • 你在问什么? Rgrep 命令。编译后的函数中不会有文本字符串if
  • 你想做什么? R 有其解析和过滤文本的方法。也许你应该花时间学习 R 的做事方式,而不是尝试应用一些效率不高的东西。

标签: r pipe


【解决方案1】:

ls() 有一个 pattern 参数,这可能是您需要的:

pattern    an optional regular expression. Only names matching pattern 
           are returned. glob2rx can be used to convert wildcard patterns 
           to regular expressions.

对于您问题的第二部分,您可以使用capture.output(getAnywhere())grep 来查看函数源代码。您需要将函数传递给该函数,我会将整个操作设为函数以保持实现干净。

【讨论】:

  • 谢谢。 xargs-like 操作怎么样?
  • 我不确定这是我想要得到的。 getAnywhere("if") 只返回内置的if 函数,但我想在其中获取所有使用if 的对象。
  • 对。您必须获取ls() 调用的输出,然后在getAnywhere() 调用中使用这些名称。 capture.output() 调用使函数行 grep-able,然后,您应该能够将所有这些包装在一个函数中,该函数接受要查找的字符串的参数。
  • 太棒了!感谢您的澄清。
【解决方案2】:

你可以的

grep("calc",list.files(),value=TRUE)

应该“模仿”ls -l | grep -i "calc"。请参阅?list.filesgrep

【讨论】:

  • @agstudy:我完全同意list.files() 的例子。但是,似乎 OP 可能会喜欢学习 R 中的 grep()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多