Une question très simple: p>
J'écris et exécutant mes scripts R à l'aide d'un éditeur de texte pour les rendre reproductibles, comme cela a été suggéré par plusieurs membres de SO. P>
Cette approche fonctionne très bien pour moi, mais je dois parfois effectuer des opérations coûteuses (par exemple, Y a-t-il un moyen de mettre en cache ce qu'un script fait jusqu'à un point à un certain point, donc chaque fois que je n'exécute que les lignes de code incrémentielles (comme je le ferais de manière interactive)? P>
Merci. P> lis.csv code> ou Remoder code> sur des bases de données de 2M à ligne) que je ' d meilleur cache dans l'environnement R plutôt que de re-exécuter à chaque fois que j'exécute le script (qui est généralement plusieurs fois au fur et à mesure que je progresse et testez les nouvelles lignes de code). P>
7 Réponses :
Je veux faire cela aussi lorsque j'utilise Sweave. Je suggérais de mettre toutes vos fonctions coûteuses (chargement et remodelage des données) au début de votre code. Exécutez ce code, puis enregistrez l'espace de travail. Ensuite, commencez les fonctions coûteuses et chargez le fichier d'espace de travail avec charger () code>. Ceci est, bien sûr, plus risqué si vous apportez des modifications non désirées au fichier d'espace de travail, mais dans ce cas, vous avez toujours le code dans les commentaires si vous souhaitez recommencer à partir de zéro. P>
Jo, merci pour la réponse. Savez-vous comment enregistrer l'espace de travail à l'aide de Textmate?
L'approche Charge () est une bonne à utiliser et elle ne dépend pas de Sweave.
Certaines façons simples sont faisables avec certaines combinaisons de p>
existe ("foo") code> Pour tester si une variable existe, sinon réchauffe ou ré-calculer li>
-
fichier.info ("foo.rd") $ ctime code> que vous pouvez comparer à sys.time () code> et voir s'il est plus récent qu'un montant donné de temps que vous puissiez charger, sinon recompaliser. li>
ul>
Il y a aussi des packages de mise en cache sur le cran qui peut être utile. p>
Dirk, mais tous les objets ne doivent-ils pas être recréés de toute façon chaque fois que le script est réexécuté? Alors Foo n'existera jamais et sera toujours recalculé, non?
Ça dépend. Parfois, on reçoit des données de, par exemple, une base de données pouvant être étendue. Vous pouvez ensuite mettre en cache ceci dans un fichier et utiliser l'horodatage (comme je l'ai décrit) pour voir si vous avez besoin d'un nouvel accès à la DB ou non. Tout dépend des détails de votre situation.
Sans entrer dans trop de détails, je suis habituellement à l'une des trois approches: p>
Attribuer code> pour attribuer un nom unique pour chaque objet important tout au long de mon exécution. Ensuite, incluez un si (existe (...)) Obtenez (...) CODE> en haut de chaque fonction pour obtenir la valeur ou le recomposer. (comme la suggestion de Dirk) li>
- Utilisez
Cachesweave code> avec mon Sweave code> Documents. Cela fait tout le travail pour vous de mettre en cache des calculs et les récupère automatiquement. C'est vraiment trivial à utiliser: utilisez simplement le pilote Cachesweave et ajoutez ce drapeau à chaque bloc: << ..., cache = true >> = code> li>
- Utilisez
Enregistrer code> et charger code> pour enregistrer l'environnement lors de moments cruciaux, en vous assurant que tous les noms sont uniques. LI>
ol> ## load the file from disk only if it
## hasn't already been read into a variable
if(!(exists("mytable")){
mytable=read.csv(...)
}
Edit: fixed typo - thanks Dirk.
Merci Chris, mais comment puis-je vous assurer que la table est maintenue dans l'espace de travail dans Textmate (ou un autre éditeur)?
Si vous courez de manière non interactive, utilisez la COMAND SAVE.IMAGE (FILE = "MYDATA.RDATA") pour enregistrer votre espace de travail. Puis chargez l'espace de travail avec charge () au début de chaque exécution. Il reste encore de la meule impliquée, car R a besoin d'obtenir toutes ces données dans la mémoire, mais cela vous fera économiser les étapes de calcul coûteuses.
En outre, envisagez de laisser une session R ouverte, de modifier vos scripts en texte Mate, de les sauver, puis de charger le nouveau code dans R. Source ("~ / Patho / myrnescript.r") de cette façon, vous n'avez pas à recharger données à chaque fois. Combinez avec des déclarations existantes () et il accélérera considérablement les choses.
Mytable Code> doit être donné sous forme de chaîne de caractères. Comme indiqué, le code ne fonctionne pas.
Après avoir fait quelque chose que vous découvrirez pour être coûteux, enregistrez les résultats de cette étape coûteuse dans un fichier de données R.
Par exemple, si vous avez chargé un CSV dans une trame de données appelée MyToutLargedataframe code> puis créé des statistiques récapitulatives de cette trame de données dans un DF appelé Vldfsummary CODE> alors vous pourriez faire cela : P> load("~/myProject/cachedData/VLDF.RData")
(réponse tardive, mais j'ai commencé à utiliser un an après la publication de cette question.) p>
C'est l'idée de base de la mémoire de mémoisation (ou de la mémoire). J'ai une longue liste de suggestions, en particulier la notice code> et Vous pouvez également profiter du point de contrôle, qui est également abordé dans le cadre de cette même liste. P>
Je pense que votre cas d'utilisation reflète ma seconde: "Mémoisation de calculs monstrueux". :) p>
Un autre astuce que j'utilise est de faire beaucoup de fichiers mappés de mémoire, que j'utilise beaucoup de, pour stocker des données. La bonne chose à propos de ceci est que plusieurs instances R peuvent accéder à des données partagées, afin que je puisse avoir beaucoup d'instances craquer au même problème. P> r.cache code> packages, dans cette requête . p>
Je suis d'accord. Mémoisation / mise en cache (avec persistance en option) est la réponse ici, pas le code ad hoc.
Le 'MusThee' Package est idéal pour ce type de problème. En plus de la mise en cache des résultats, il peut également inclure des liens vers des dépendances afin que le code soit réutilisé si les dépendances changent.
divulgation: j'ai écrit cet outil ('musûte), bien que je ne fais pas Tous les gains financiers des autres l'utilisent. Je l'ai fait pour cet objectif exact pour mon propre travail et je veux le partager avec d'autres. Em> p> ci-dessous est un exemple simple. La variable code> FOO code> est créée et "bloquée" pour plus tard. Si le même code est re-exécuté, la variable La documentation a des exemples supplémentaires des cas d'utilisation plus complexes et une explication détaillée de la façon dont il fonctionne sous la hotte. p> p> FOO code> est chargé à partir du disque et ajouté à l'environnement global. P>
Vous devriez être sûr de lire les règles d'auto-promotion de la pile surplaçant.
Votre profil indique que vous êtes associé aux sites que vous avez liés. Lier à quelque chose que vous êtes affilié à (par exemple, une bibliothèque, un outil, un produit ou un site Web) sans divulguer c'est le vôtre b> est considéré comme un spam sur le débordement de la pile. Voir: Qu'est-ce qui signifie "bonne" promotion auto-économique? , quelques conseils et conseils sur soi-même -promotion , Quelle est la définition exacte de "spam" pour débordement de pile? et Quasse quelque chose de spam .
Lorsque vous avez modifié votre message pour corriger le (s) problème (s) mentionné (s) mentionné ci-dessus, vous pouvez signaler un modérateur pour examiner et non-sélection.