web-dev-qa-db-fra.com

Avertissement: fermeture de la connexion inutilisée n

getCommentary=function(){
    Commentary=readLines(file("C:\\Commentary\\com.txt"))
    return(Commentary)
    close(readLines)
    closeAllConnections()
}

Je n'ai aucune idée de ce qui ne va pas avec cette fonction. Lorsque je lance ceci dans R, il continue de me donner l'avertissement suivant:

Warning message:
closing unused connection 5 ("C:\\Commentary\\com.txt") 
22
Eva

readLines() est une fonction, vous n'avez pas close() elle. Vous souhaitez fermer la connexion ouverte par la fonction file(). De plus, vous êtes return() ing avant vous fermez toutes les connexions. En ce qui concerne la fonction, les lignes après l'instruction return() n'existent pas.

Une option consiste à enregistrer l'objet renvoyé par l'appel file(), car vous ne devez pas fermer toutes les connexions uniquement celles ouvertes par votre fonction. Voici une version non fonctionnelle pour illustrer l'idée:

R> cat("foobar\n", file = "foo.txt")
R> con <- file("foo.txt")
R> out <- readLines(con)
R> out
[1] "foobar"
R> close(con)

Pour écrire votre fonction, cependant, je prendrais probablement une approche légèrement différente:

getCommentary <- function(filepath) {
    con <- file(filepath)
    on.exit(close(con))
    Commentary <-readLines(con)
    Commentary
}

Qui est utilisé comme suit, avec le fichier texte créé ci-dessus comme exemple de fichier à lire

R> getCommentary("foo.txt")
[1] "foobar"

J'ai utilisé on.exit() pour qu'une fois que con soit créé, si la fonction se termine, pour une raison quelconque, la connexion sera fermée. Si vous l'avez laissé juste à une instruction close(con) juste avant la dernière ligne, par exemple:

    Commentary <-readLines(con)
    close(con)
    Commentary
}

la fonction pourrait échouer lors de l'appel de readLines() et se terminer, la connexion ne serait donc pas fermée. on.exit() organiserait la fermeture de la connexion, même si la fonction se termine tôt.