24

現在のファイルの場所を作業ディレクトリにしたい。

Rstudio の使用 (動作します!):

# Author  : Bhishan Poudel
# Program : writehere.r
# Source  : Rscript writehere.r

# set working directory here
this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works.
setwd(this.dir)

# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")
#This works flawlessly in  MacOS 10.9 and Ubuntu 15.1.

端末からのコマンドの使用: Rscript writehere.r (動作しません!)

Error in dirname(parent.frame(2)$ofile) : 
  a character vector argument expected
Execution halted


------------------
(program exited with code: 1)

端末からのコマンドの使用: Rscript writehere.r (動作するようになりました!)

# Author  : Bhishan Poudel
# Program : writehere.r
# Source  : Rscript example.r

# set working directory here
this_dir <- function(directory)
setwd( file.path(getwd(), directory) )

# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")

Rstudio の ~/.Rprofile 内で関数を使用する (動作します!) : ,

##############################################
# inside ~/.Rprofile
# set up working directory
setwd_thisdir <- function () {
  this.dir <- dirname(parent.frame(3)$ofile)
  setwd(this.dir)
} 
##############################################

次に、任意のディレクトリに writehere.r ファイルがあるとします。これで動作します。

# Author  : Bhishan Poudel
# Program : writehere.r
# Compile : Rscript writehere.r

# set working directory here
setwd_thisdir

# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")

質問: なぜ関数

this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works.
setwd(this.dir)

Rstudio以外のテキストエディタでは動かない?

いくつかの便利なリンクは次のとおりです
。R 作業ディレクトリをソース ファイルの場所に設定しますか?
作業ディレクトリをソース ファイルの場所に設定するための R コマンド現在の作業ディレクトリ内
の `source`d ファイルのファイル名とパスを取得する
setwd()
「作業ディレクトリをソース ファイルの場所に設定する」ためのコマンド
SublimeText と R: 現在のファイル ディレクトリの
設定 作業ディレクトリの設定
R作業ディレクトリを永続的に設定する簡単な方法は何ですか?
R作業ディレクトリをソースファイルの場所に設定しますか?
Rでファイルのディレクトリに入る方法は?

4

5 に答える 5

5

簡単に、rstudio API を使用してそのディレクトリを抽出し、以下に示すように作業ディレクトリとして設定します。

setwd(dirname(rstudioapi::getSourceEditorContext()$path))

次のコマンドを使用して、ディレクトリが正しく設定されているかどうかを確認します。

getwd()
于 2019-08-31T11:29:38.127 に答える
1

更新: この回答はまったく役に立たないことに気付きました。別の回答を投稿します。

実行したいコードが追加の引数を必要としない限り、以下にスケッチされているソリューションを使用eval(expr, envir)するとうまくいくかもしれません。

コマンドラインで使用するprint(environment())と返されるはずの を使用した次の例を考えてみましょう。environment: R_GlobalEnv関数test_1は、関数が呼び出されたときに作成される内部環境に関する情報を出力しますが、関数はtest_2目的の結果を返します。

test_1 <- function(){
     print(environment())
}

test_2 <- function(){
    .expr <- quote({
        print(environment())
        })
    .envir <- sys.frame(which = -1)
    eval(expr = .expr,
         envir = .envir)
}

sys.frame(which = -1)、関数が呼び出される環境で式が評価されることを保証します。常にグローバル環境を使用することが確実な場合は、 を使用することをお勧めします.GlobalEnv。使用したい式を引用することも重要です。そうしないと、期待どおりに機能しない可能性があります。

このソリューションの優れた機能は、関数に入れたいコードを微調整する必要がなく、引用するだけであることです。

最後に、このアプローチを拡張して、別の環境で評価したいコードに渡される引数を関数が取ることができるようにすることができます。ただし、これには、評価したい式に多少の微調整が必​​要になります。bquote+.()構造 -を使用する必要がある場合があり、さらに and も使用する必要がある場合がcallありdo.callます。

于 2016-04-09T08:11:39.810 に答える
1

関数で使用parent.frame(3)してみてください:

setwd_thisdir <- function () {
  this.dir <- dirname(parent.frame(3)$ofile)
  setwd(this.dir)
}

?parent.frameまたはhttp://adv-r.had.co.nz/Environments.html#calling-environmentsを参照してください。

関数のchdirオプション( )も参照してください。source?source

于 2016-03-27T23:43:34.313 に答える