在Shiny中格式化响应式数据框

8

我有一个正在运行的Shiny应用程序,但现在我要更改它,使输入数据是反应性的 - 当基础数据更新时,它会更新。当它只读取数据时,它工作得很好,但现在数据是反应性的,我遇到了一个问题(其他两个文件都像预期的一样工作)。该文件是从数据库导出的.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

对于另一行也是类似的操作。这里发生了什么?我可以在从 reactiveFileInput 读取的 data.frame 中执行这些操作吗?我试图将基础 .csv 文件中的名称更改为下划线而不是空格,并尝试将 names() as.Date()放入 reactive()表达式中,但这些都没有任何区别。

谢谢

1个回答

14

我在回答自己的问题时,主要想说我当时太傻了。一旦使用 reactiveFileReader() 读取文件,它就成为了一个“反应式源”。正如在 这里 的 shiny 教程中所解释的那样,反应式源是从外部修改的 - 用户输入新值,或者在这种情况下,更新文件。你不能从 server.r 内部修改它。

因此,在我的情况下,我使用了 read.csv() 中的 col.namescolClasses 选项以尽可能好的格式获得原始数据。我还利用非常有用的 setAs 函数,让 read.csv 理解如何格式化日期,如此处所述:Specify date format for colClasses argument ...

从那里开始,我需要从数据创建任何新列都必须作为单独的对象使用反应式函数来完成,例如:

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

然后可以随意使用 NewThing()。这就是您可以解决数值列中的字符值等问题的方法。如果您尝试使用 colClasses="numeric" 将其直接导入,将会出现错误,并且 read.csv() 将会失败。相反,首先将该列作为 "character" 导入,然后使用 reactive({})as.numeric() 将其分配给一个新对象。请注意,新对象不能是使用 reactiveFileReader() 导入的 data.frame 中的新列,而必须是依赖于该 data.frame 的新对象。


@ John Paul。看起来我和你在这篇文章中遇到了相似的问题。然而,基于你的见解,我并没有真正解决我的问题。有什么想法可以帮我解决这个问题吗?以下是问题链接。谢谢。https://dev59.com/3Zfga4cB1Zd3GeqPCeIN?noredirect=1#comment63045945_37736782 - SimonB
@ John Paul。我也遇到了这个问题,需要帮助才能解决。谢谢。我的目标是将最后一列更改为日期。我尝试了几种方法。.https://stackoverflow.com/questions/54467692/how-to-upload-a-data-with-date-properly-in-shiny-r - Cengover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接