importer le fichier lorsqu'il n'est pas utilisé (plus)
J'ai un flexdashboard qui est utilisé par plusieurs utilisateurs. Ils lisent, modifient et écrivent le même fichier (csv). Je n'ai pas été en mesure de comprendre comment faire cela avec une connexion SQL, donc en attendant (j'ai besoin d'une application fonctionnelle), j'aimerais utiliser un simple fichier .csv comme base de données. Cela devrait être bien car les utilisateurs ne sont pas susceptibles de travailler dessus exactement au même moment et le chargement et l'écriture du fichier complet sont presque instantanés.
Ma stratégie est donc:
Fichier à 1 chargement,
2-edit (les modifications sont effectuées dans rhandsontable qui est reconverti en dataframe)
3-save: (a) -charge le fichier à nouveau (pour obtenir les dernières données), (b) -ajoute les modifications du tableau de bord et conserve les dernières données (indiquées par un horodatage) (c) -write.csv
Je pense que je devrais ajouter quelque chose dans (1) pour qu'il vérifie si le fichier n'est pas déjà utilisé / ouvert (car un autre utilisateur est à (3). Donc: vérifiez s'il est ouvert, sinon-> continuer, sinon -> sys.sleep (3) et réessayez.
Des idées sur la façon de faire cela en R? Dans Delphi, ce serait quelque chose comme: if fileinuse (filename) then sleep (3) else df <-read.csv
Quelle est la voie R?
Éditer:
Je commence par ma réponse éditée car elle est plus élégante. Cela utilise une commande shell pour tester si un fichier est disponible, comme indiqué dans cette question:
Cela évite de charger et d'enregistrer le fichier et est donc plus efficace.
# Function to test availability
IsInUse <- function(fName) {
shell(paste("( type nul >> ", fName, " ) 2>nul && echo available || echo in use", sep=""), intern = TRUE)=="in use"
}
# Test availability
IsInUse("test.txt")
Réponse originale:
Question interessante! Je n'ai pas trouvé de moyen de vérifier si un fichier est en cours d'utilisation avant d'essayer d'écrire dessus. La solution ci-dessous est loin d'être élégante. Il s'appuie sur une fonction tryCatch, et sur la lecture et l'écriture dans un fichier pour vérifier s'il est disponible (ce qui peut être assez lent en fonction de la taille de votre fichier).
# Function to check if the file is in use (relies on reading and writing which is inefficient)
IsInUse <- function(fName) {
rData <- read.csv(fName)
tryCatch(
{
write.csv(rData, file=fName, row.names = FALSE)
return(FALSE)
},
error=function(cond) {
return(TRUE)
}
)
}
# Loop to check if file is in use
while(IsInUse(fName)) {
print("Still in use")
Sys.sleep(0.1)
}
# Your action here
J'ai également trouvé la réponse à cette question utile Comment écrire trycatch en R pour donner un sens à la fonction tryCatch.
Je serais intéressé de voir si quelqu'un d'autre a une suggestion plus élégante!