2016-12-07 9 views
-1

私は以下のif文をRに書いています。うまくいきますが、私は1)完全に理解していない2)ではないという厄介な警告メッセージがあります。 1に関しては:-)未使用の接続をクローズする際のRの警告メッセージを抑制する方法は?

):それは何

を意味し、 "警告メッセージ:クローズ未使用の接続3"

そして、何数(3)は、この文脈で意味があります? グーグルが私にいくつかのポインタ(How to fix error "closing unused connection"Warning: closing unused connection n)を見つけましたが、うまくいかないようですが、私は知っています。私は間違って何をしていますか? 以下は私のコードです。

ありがとうございます!

サンダー

filetype = summary(file(opt$datagwas))$class 

if(filetype == "gzfile"){ 
    cat("\n* The file appears to be gzipped, checking delimiter now...") 
    TESTDELIMITER = readLines(opt$datagwas, n = 1) 
    cat("\n* Data header looks like this:\n") 
    print(TESTDELIMITER) 
    if(grepl(",", TESTDELIMITER) == TRUE){ 
    cat("\n* Data is comma-seperated, loading...\n") 
    GWASDATA_RAW = fread(paste0("zcat < ",opt$datagwas), 
    header = TRUE, sep = ",", dec = ".", 
    na.strings = c("", "NA", "na", "Na", "NaN", 
    "Nan", ".","N/A","n/a", "N/a"), 
    blank.lines.skip = TRUE) 
    } else { 
    cat ("\n\n*** ERROR *** Something is rotten in the City of Gotham. The GWAS data is neither comma, tab, space, nor semicolon delimited. Double  back, please.\n\n", file=stderr()) # print error messages to stder 
    } 
    } else if(filetype != "gzfile") { 
    cat("\n* The file appears not to be gezipped, checking delimiter  now...") 
    TESTDELIMITER = readLines(opt$datagwas, n = 1) 
    cat("\n* Data header looks like this:\n") 
    print(TESTDELIMITER) 
    if(grepl(",", TESTDELIMITER) == TRUE){ 
    cat("\n* Data is comma-seperated, loading...\n") 
    GWASDATA_RAW = fread(opt$datagwas, 
    header = TRUE, sep = ",",dec = ".", 
    na.strings = c("", "NA", "na", "Na","NaN", 
    "Nan", ".","N/A","n/a","N/a"), 
    blank.lines.skip = TRUE) 
    } else { 
    cat ("\n\n*** ERROR *** Something is rotten in the City of Gotham. The  GWAS data is neither comma, tab, space, nor semicolon delimited. Double  back, please.\n\n", file=stderr()) # print error messages to stder 
    } 
    } else { 
    cat ("\n\n*** ERROR *** Something is rotten in the City of Gotham. We  can't determine the file type of the GWAS data. Double back, please.\n\n",  file=stderr()) # print error messages to stder 
    } 
closeAllConnections() 

答えて

2

あなたがすべきことは、ファイルを一度開き、その接続を変数として保存することです。その後、あなたがそれを使用し終えたら、自分で接続を閉じます。

# Open it 
conn <- file(opt$datagwas) 

# Extract the information you need 
filetype <- summary(conn)$class 
TESTDELIMITER <- readLines(conn, n = 1) 

# Then close it 
close(conn) 

# Continue with if-clause, fread, etc as before 

あなたのアプローチは、この特定のケースを解決する可能性があります。しかし、他のケースでは、おそらくパフォーマンスの問題やクラッシュにつながる、それらを正しく認識しないことで、数千から数百万の未閉鎖の接続を生成している可能性があります。

+0

しかし、上記の私の特定の例では、 'readLines'と' filetype'から来ている 'TESTDELIMITER'を' summary(file(file.txt)) 'のように閉じなければなりませんか? –

+1

いいえ、これらの変数は接続ではありません。接続は即時に作成されましたが、変数に割り当てられていないので、手動で直接閉じることはできません。 あなたはこのような何か行う必要があります。 CONN < - ファイル(OPT $ datagwas) ファイルタイプ< - 概要(CONN)$クラス TESTDELIMITER < - readLines(CONN、N = 1) 近い(CONN) #を以前のようにif節、freadなどを続けてください。 – mpjdem

+0

分かりやすくするために上記のコードブロックを参照してください – mpjdem

0

私は、必要な変更を行っ@mpjdemに感謝します。

datagwas_connection <- file(opt$datagwas)

filetype <- summary(datagwas_connection)$class

TESTDELIMITER <- readLines(datagwas_connection, n = 1)

close(datagwas_connection)

if(filetype == "gzfile"){ cat("\n* The file appears to be gzipped, checking delimiter now...") cat("\n* Data header looks like this:\n") print(TESTDELIMITER) if(grepl(",", TESTDELIMITER) == TRUE){などなどなど(コードの残りの部分)

これは魔法のように動作します。再度、感謝します!

関連する問題