我有一个工作闪亮的应用程序,但我正在更改它,以便输入数据是被动的 - 它将在基础数据更新时更新。它只是在读取数据时工作正常,但现在数据是被动的,我遇到了其中一个文件的问题(其他两个文件正如预期的那样工作)。该文件是从数据库导出的.csv,我想在使用之前做一些内务处理 - 更改一些名称并格式化一些数据。相关部分是:
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()
表达式中,但这些没有区别。
由于
答案 0 :(得分:14)
我回答我自己的问题主要是说我是一个nincompoop。使用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
的新对象。