8

R には、指定した 1 つのディレクトリから多くの CSV に対して lapply() を介して summary() を実行する単純な関数があります。関数を以下に示します。

#   id -- the file name (i.e. 001.csv) so ID == 001. 
#   directory -- location of the CSV files (not my working directory)
#   summarize -- boolean val if summary of the CSV to be output to console. 
getMonitor <- function(id, dir, summarize = FALSE) 
{
    fl <- list.files(dir, pattern = "*.csv", full.names = FALSE)

    fdl <- lapply(fl, read.csv)

    dataSummary <- lapply(fdl, summary)

    if(summarize == TRUE)
    { dataSummary[[id]] }
}

ディレクトリを指定して、それをパラメーターとして関数に渡そうとすると、次のようになります。

dir <- "C:\\Users\\ST\\My Documents\\R\\specdata"
funcVar <-  getMonitor("001", dir, FALSE)

次のエラーが表示されます。

ファイルのエラー (file, "rt") : 接続を開くことができません。さらに: 警告メッセージ: In file(file, "rt"): cannot open file '001.csv': No such file or directory

それでも、以下のコードを単独で実行すると:

fl <- list.files("C:\\Users\\ST\\My Documents\\R\\specdata", 
                  pattern = "*.csv", 
                  full.names = FALSE)
fl[1]

私が指しているディレクトリを見つけ、fl[1]はリストされた最初のファイルである[1] "001.csv"を正しく出力します。

私の質問は、このパス変数をパラメーターとして関数に渡そうとするときに何が間違っているのかということです。R はこのようにパラメーターを処理できませんか? 私が完全に欠けているものはありますか?私は周りを検索してみましたが、他のプログラミング言語に精通しているので、率直に言って、今これに行き詰まっているのはちょっとばかげている/敗北していると感じています.

4

1 に答える 1

11

修飾パスで にfl[1]直接渡します。read.csv代わりに を使用full.names=TRUEすると、完全なパスが取得され、read.csvステップが適切に機能します。ifただし、ステートメントを再び機能させるには、少し手を加える必要があります。

関数を拡張してlapply、ディレクトリとファイル名を一緒に貼り付けることもできます。

fdl <- lapply(fl, function(x) read.csv(paste(dir, x, sep='\\')))

または、この貼り付けたフル パスを別の行に作成します。

fl.qualified <- paste(dir, fl, sep='\\')
fdl <- lapply(fl.qualified, read.csv)

このステップを実行するときpaste、本当に明示的にしたい場合はregex、末尾にスラッシュが付いたディレクトリを渡す人がいないことを確認することをお勧めします。

fl.qualified <- paste(gsub('\\\\$', '', dir), f1, sep='\')

またはそれらの線に沿った何か。

于 2013-01-24T18:39:30.160 に答える