2013-11-25 3 views
8

У меня есть работающее блестящее приложение, но я меняю его так, чтобы входные данные были реактивными - он будет обновляться при обновлении базовых данных. Он работал нормально, когда он просто читал данные, но теперь, когда данные реагируют, у меня возникают проблемы с одним из файлов (два других работают так, как ожидалось). Файл представляет собой .csv, который экспортируется из базы данных, и я хотел бы немного поработать перед использованием - изменить некоторые имена и форматировать некоторые данные. Соответствующая часть:Форматирование реактивных data.frames в Shiny

server.r 

W.Data<-reactiveFileReader(2000,session, 
      "WaterData.csv",read.csv,header=TRUE,as.is=TRUE) 

Это прекрасно работает, но затем следующие две строки не будут работать:

names(W.Data())[names(W.Data())=="Visit_Start_Date"]<-"Visit.Date" 
W.Data()$Visit.Date<-as.Date(W.Data()$Visit.Date,"%m/%d/%Y") 

Когда я запускаю это я получаю

Error in W.Data()$VisitDate <- as.Date(W.Data()$VisitDate, "%m/%d/%Y"): 
invalid (NULL) left side of assignment 

и подобное для другой линии. Что здесь происходит? Могу ли я делать такие вещи с data.frame, который читается с reactiveFileInput? Я попытался изменить имена в базовом .csv-файле, чтобы иметь символы подчеркивания, а не пробелы, и я попытался поместить names() и as.Date() в выражениях reactive(), но это не имело никакого значения.

Благодаря

ответ

13

Я отвечаю на мой собственный вопрос в основном сказать, что я был быть размазня. Когда файл читается с использованием reactiveFileReader(), он становится «реактивным источником». Как объяснено в блестящем учебнике here, реактивные источники модифицируются извне - пользователь вводит новое значение или в этом случае обновление файла. Вы не можете изменить его изнутри server.r.

Итак, для моего случая я использовал параметры col.names и colClasses в read.csv(), чтобы получить исходные данные в лучшем формате, который я мог бы использовать. Я также использовал очень полезную функцию setAs, чтобы получить read.csv, чтобы понять, как отформатировать дату, как описано здесь: Specify date format for colClasses argument ....

Оттуда, любые новые столбцы, которые мне нужно было создать из данных, должно было быть сделано в качестве отдельного объекта, используя реактивную функцию:

NewThing<-reactive({ function(MyReacitveCSVdata()$colname) }) 

А потом NewThing() в свою очередь, могут быть использованы, однако вы пожелает. Вот как вы можете обойти такие проблемы, как значения символов в столбце, отличном от числа. Если вы попытаетесь просто принести его с помощью colClasses="numeric", вы получите сообщение об ошибке, и read.csv() потерпит неудачу. Вместо этого сначала импортируйте столбец как «символ», а затем используйте reactive({}) с as.numeric(), чтобы присвоить его новому объекту. Не забудьте отметить, что новый объект не может быть новым столбцом в data.frame, который вы использовали с помощью reactiveFileReader(), вместо этого он должен быть новым объектом, который зависит от этого data.frame.

+0

@ John Paul. Кажется, у меня такая же проблема, как и в этом посте. Тем не менее, я не мог исправить свою проблему на основе ваших соображений. Любые идеи, как я мог бы исправить свою проблему. Ниже ссылка на вопрос. Благодарю. http://stackoverflow.com/questions/37736782/add-new-variable-column-in-the-fly-to-a-reactive-dataframe-in-shiny?noredirect=1#comment63045945_37736782 – SimonB

Смежные вопросы