我的 R 工作流程通常是这样的:我打开一个文件,在其中输入 R 命令,并且我想在单独打开的 R shell 中执行这些命令。
最简单的方法是在 R 中输入
source('the-file.r')
。但是,这总是会重新加载整个文件,如果处理大量数据,这可能需要相当长的时间。它还要求我再次指定文件名。
理想情况下,我只想从文件中获取特定行(或多行)(我正在一个无法复制和粘贴的终端上工作)。
source
似乎没有提供此功能。还有其他方法可以实现这一目标吗?
这是仅使用 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), ...)
}
正如评论中所讨论的,“真正的”解决方案是使用允许获取文件特定部分的 IDE。现有的解决方案有很多:
,有 R.nvim。
,有 ESS。
RStudio 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)
有趣的故事:我最近发现自己所在的集群配置混乱,无法安装所需的软件,但由于截止日期迫在眉睫,我迫切需要调试 R 工作流程。我别无选择,只能手动将 R 代码行复制并粘贴到控制台中。 在这种情况下,上述内容可能会派上用场。是的,这确实发生了。