を解決しません。以下は私が思いついた解決策です。 私は基本的にlist2env
を使用して変数をグローバルまたは関数のローカル環境 にプッシュし、次に指定された環境の関数source
をプッシュします。
これは、スクリプトをスタンドアロンに保つことができる以下の例に示すように、特にexists
と組み合わせて使用すると非常に便利です。
これら二つの質問にも助けになることがあります。基本パッケージで Source-ing an .R script within a function and passing a variable through (RODBC) How to pass command-line arguments when source() an R file
# Function ----------------------------------------------------------------
subroutine <- function(file, param = list(), local = TRUE, ...) {
list2env(param, envir = if (local) environment() else globalenv())
source(file, local = local, ...)
}
# Example -----------------------------------------------------------------
# Create an example script
tmp <- "test_subroutine.R"
cat("if (!exists('msg')) msg <- 'no argument provided'; print(msg)", file = tmp)
# Example of using exists in the script to keep it stand-alone
subroutine(tmp)
# Evaluate in functions environment
subroutine(tmp, list(msg = "use function's environment"), local = TRUE)
exists("msg", envir = globalenv()) # FALSE
# Evaluate in global environment
subroutine(tmp, list(msg = "use global environment"), local = FALSE)
exists("msg", envir = globalenv()) # TRUE
unlink(tmp)
私はそれを関数にすることが「対話的に使う」ことができないことを理解するのに苦労しています。 – joran
私は時々、私はブラウザを使ってできる行ごとにスクリプトを実行したいのですが、最適ではありません... –
それから私はそれを関数にすることをお勧めします。それをチャンクで実行するには、パラメータを設定し、チャンクによって関数チャンクの内容を実行します。ブラウザに機能を追加するには、ブラウザをもう一度起動して実行します。 – Hansi