R 仅源文件的一部分

R 仅源文件的一部分,r,read-eval-print-loop,R,Read Eval Print Loop,我的R工作流通常是这样的:我打开了一个文件,在其中键入R命令,我希望在单独打开的R shell中执行这些命令 最简单的方法是在r中说source('The-file.r')。但是,这总是会重新加载整个文件,如果处理大量数据,这可能需要相当长的时间。它还要求我再次指定文件名 理想情况下,我只想从文件中找到一行(或多行)(我正在使用的终端无法进行复制和粘贴) source似乎不提供此功能。有没有其他方法可以实现这一点?使用适合工作的工具… 正如在评论中所讨论的,真正的解决方案是使用一个IDE,该ID

我的R工作流通常是这样的:我打开了一个文件,在其中键入R命令,我希望在单独打开的R shell中执行这些命令

最简单的方法是在r中说
source('The-file.r')
。但是,这总是会重新加载整个文件,如果处理大量数据,这可能需要相当长的时间。它还要求我再次指定文件名

理想情况下,我只想从文件中找到一行(或多行)(我正在使用的终端无法进行复制和粘贴)

source
似乎不提供此功能。有没有其他方法可以实现这一点?

使用适合工作的工具… 正如在评论中所讨论的,真正的解决方案是使用一个IDE,该IDE允许查找文件的特定部分。现有的解决方案有很多:

  • 对于Vim

  • 对于Emacs,存在以下问题

  • 当然还有出色的单机版

需要特别注意的是,上述所有解决方案都可以在本地和服务器上工作(例如,通过SSH连接访问)。R甚至可以在HPC集群上运行—如果设置正确,它仍然可以与IDE通信

…或者…不是。 如果,无论出于何种原因,上述解决方案都不起作用,那么这里有一个解决方案。不过,我一般不建议使用它。1



1个有趣的故事:我最近发现自己在一个集群上,配置混乱,无法安装所需的软件,但由于迫在眉睫的最后期限,迫切需要调试R工作流。实际上,我别无选择,只能手动将R代码行复制并粘贴到控制台中。在这种情况下,上述方法可能会派上用场。是的,这确实发生了。

这是另一种使用R的方法:

source2 <- function(file, start, end, ...) {
    file.lines <- scan(file, what=character(), skip=start-1, nlines=end-start+1, sep='\n')
    file.lines.collapsed <- paste(file.lines, collapse='\n')
    source(textConnection(file.lines.collapsed), ...)
}

source2那是什么终端?12月VT100?要么获得更好的终端,要么获得更好的环境-emacs?-或者重新考虑您的工作流程,或者将您的文件拆分为其他文件,并拥有大量嵌套的文件,这些文件来自其他文件,或者正确地执行这些操作并生成更多功能…@Spacedman tmux with split window。在整个终端上复制副本,这意味着它复制垃圾。但即使不是这样,我在启用光标模式的远程机器上使用Vim,这将禁用终端文本选择i、 你不能使用本地剪贴板,也没有远程剪贴板。那又怎样?我一直使用远程tmux和远程emacs;仍然在emacs中为您提供缓冲区,您可以根据需要从中获取部件。如果你愿意的话,Emacs ESS甚至可以让本地Emacs连接到远程R会话(我不这么做)。也许可以在这里使用munging工具。@Konrad——酷!“按区域”和从文件开始工作是一种方法。我认为使用
存储最后一个源文件我认为在
.GlovalEnv
中放置一个隐藏环境确实是一种方法,如果你真的想保留最后一个文件名。(在这种情况下这是非常明智的。)至于去掉
sed
,你可以使用
readLines()
读取文件,然后选择所需的行并对它们进行求值。在R中创建变量参数列表的优雅方法是定义它们并测试它们是否提供了
缺少的
@KonradRudolph,是的,你是对的,它不一定是一个环境。我的主要观点是,将它存储在
.GlobalEnv
中更好,如果变量名以点开头就好了,因为这样它就不会在
ls()
中列出,也不会在
rm(list=ls())
中删除,等等。
# Source the whole file:
rs('some_file.r')
# Re-soure everything (same file):
rs()
# Re-source just the fifth line:
rs(from = 5)
# Re-source lines 5–10
rs(from = 5, to = 10)
# Re-source everything up until line 7:
rs(to = 7)
source2 <- function(file, start, end, ...) {
    file.lines <- scan(file, what=character(), skip=start-1, nlines=end-start+1, sep='\n')
    file.lines.collapsed <- paste(file.lines, collapse='\n')
    source(textConnection(file.lines.collapsed), ...)
}