仅获取文件的一部分

问题描述 投票:0回答:2

我的 R 工作流程通常是这样的:我打开一个文件,在其中输入 R 命令,并且我想在单独打开的 R shell 中执行这些命令。

最简单的方法是在 R 中输入

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

理想情况下,我只想从文件中获取特定行(或多行)(我正在一个无法复制和粘贴的终端上工作)。

source
似乎没有提供此功能。还有其他方法可以实现这一目标吗?

r read-eval-print-loop
2个回答
25
投票

这是仅使用 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), ...)
}

11
投票

使用正确的工具来完成工作......

正如评论中所讨论的,“真正的”解决方案是使用允许获取文件特定部分的 IDE。现有的解决方案有很多:

    对于
  • NeoVim

    ,有 R.nvim

  • 对于
  • Emacs

    ,有 ESS

  • 当然还有优秀的独立版
  • RStudio IDE

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

…或…

不是

如果出于某种原因,上述解决方案都不起作用,这里有一个

一个小模块

[要点]可以完成这项工作。不过,我通常不建议使用它。1 #' (Re-)source parts of a file #' #' \code{rs} loads, parses and executes parts of a file as if entered into the R #' console directly (but without implicit echoing). #' #' @param filename character string of the filename to read from. If missing, #' use the last-read filename. #' @param from first line to parse. #' @param to last line to parse. #' @return the value of the last evaluated expression in the source file. #' #' @details If both \code{from} and \code{to} are missing, the default is to #' read the whole file. rs = local({ last_file = NULL function (filename, from, to = if (missing(from)) -1 else from) { if (missing(filename)) filename = last_file stopifnot(! is.null(filename)) stopifnot(is.character(filename)) force(to) if (missing(from)) from = 1 source_lines = scan(filename, what = character(), sep = '\n', skip = from - 1, n = to - from + 1, encoding = 'UTF-8', quiet = TRUE) result = withVisible(eval.parent(parse(text = source_lines))) last_file <<- filename # Only save filename once successfully sourced. if (result$visible) result$value else invisible(result$value) } })

使用示例:

# 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)


1

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

© www.soinside.com 2019 - 2024. All rights reserved.