importer le fichier lorsqu'il n'est pas utilisé (plus)


Algomas

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?

MatAff

É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:

Comment vérifier en ligne de commande si un fichier ou un répertoire donné est verrouillé (utilisé par n'importe quel processus)?

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!

Articles connexes


htaccess n'ouvre pas le fichier lorsqu'il est demandé

Gleb Ponomarev dites moi quel est le problème, disons qu'il y a un fichier web/quberty/2.jpeg, je vais sur le lien host/quberty/2.jpeg, le site produit 404, bien que la règle soit RewriteCond %{REQUEST_URI} !^/(web) RewriteRule ^assets/(.*)$ /web/assets/$1 [L]