15

私の R ワークフローは、通常、R コマンドを入力するファイルを開いており、それらのコマンドを個別に開いた R シェルで実行したいと考えています。

これを行う最も簡単な方法は、source('the-file.r')R 内で行うことです。ただし、これは常にファイル全体をリロードするため、大量のデータが処理される場合はかなりの時間がかかる場合があります。また、ファイル名を再度指定する必要があります。

理想的には、ファイルから特定の行 (または行) のみを取得したいと思います(コピー & ペーストが機能しない端末で作業しています)。

sourceこの機能を提供していないようです。これを達成する別の方法はありますか?

4

2 に答える 2

21

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), ...)
}
于 2012-08-31T12:50:19.843 に答える
7

仕事に適したツールを使用する…</h2>

コメントで説明されているように、実際の解決策は、ファイルの特定の部分をソースできる IDE を使用することです。多くの既存のソリューションがあります。

  • VimにはNvim -Rがあります。

  • EmacsにはESSあります。

  • もちろん、優れたスタンドアロンのRStudio IDEもあります。

特別な注意点として、上記のソリューションはすべて、ローカルとサーバーの両方で機能します (たとえば、SSH 接続を介してアクセスします)。R は HPC クラスター上で実行することもできます — 適切に設定されていれば、R は IDE と通信できます。

...または...そうではありません

なんらかの理由で、上記の解決策がどれもうまくいかない場合、ここに小さなモジュール[gist]があり、その仕事をすることができます。ただし、一般的に使用することはお勧めしません。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 コードの行をコピーしてコンソールに手動で貼り付けるしかありませんでした。これは、上記が役立つ可能性がある状況です。そして、はい、それは実際に起こりました。

于 2012-08-31T12:01:05.227 に答える