2017-08-31 1 views
2

J'ai regardé cette question mais ne peut toujours pas à obtenir mon code pourComment utiliser isolate pour rendre un dataframe non réactif dans R Shiny?

How to 'save' reactive dataframe as non-reactive in shiny/R

Je suis en train de lire dans un fichier csv dans une application brillante et faire de chaque cellule dans le fichier csv un variable à utiliser plus tard dans l'application. Est-ce possible? J'ai lu à propos de l'utilisation de isolate() mais ça n'a pas marché pour moi. Chaque fois que je crée une variable à partir d'une information contenue dans le fichier, il y a une erreur qui dit que cela ne peut pas être fait parce que le fichier est réactif. Le code que j'ai utilisé pour lire dans le fichier est ci-dessous. Toute aide sur la façon de créer des variables à partir du contenu de la csv serait incroyablement utile.

filedata <- reactive({ 
    inFile <- input$datafile 

    if (is.null(inFile)) 
    return(NULL) 

    data <- read.csv(inFile$datapath) 

}) 
isolate(filedata()) 

Pour que cela fonctionne, je crois que le fichier doit être non réactif.

Merci!

Répondre

1

isolate ne vous aidera pas ici. Son but est de faire (des sections de) réactifs pas réagir aux changements dans l'entrée. D'après votre description, il semble que vous vouliez avoir des données que vous pouvez muter d'une manière ou d'une autre? Si vous avez juste besoin d'accéder à des cellules sans les modifier, vous ne vraiment pas besoin de quoi que ce soit, aussi longtemps que vous êtes dans un environnement réactif (c.-à-render, observer, réactif, peut-être plus) Il suffit de faire

filedata()[row, column] 

pour accéder à votre cellule. Par exemple, si vous voulez avoir un réactif avec la valeur de la troisième cellule dans la première rangée, vous pouvez faire

thirdCellInFirstRow <- reactive(filedata()[row, column]) 

puis utilisez thirdCellInFirstRow() pour accéder à cette valeur dans un autre réactif.

Si vous devez pouvoir modifier les données de l'ensemble de données, par exemple le contenu d'une cellule, vous devez utiliser une structure différente. Une possibilité est reactiveValues ou . Créer un reactiveValues vide dans votre fonction serveur:

storedData <- reactiveValues 

Ensuite, vous pouvez stocker votre bloc de données là-bas, par exemple en utilisant dans votre filedata réactif:

storedData$df <- read.csv(inFile$datapath) 

Vous pouvez maintenant accéder à cet ensemble de données de autres environnements réactifs comme storedData$df et y lire ou écrire des données.

+0

Si vous souhaitez en savoir plus, je vous recommande de lire le tutoriel de réactivité sur le hub brillant et peut-être regarder les conférences vidéo de ShinyConf. C'est un peu inhabituel au début, mais une fois qu'on s'y habitue, la réactivité est très agréable à programmer. –