R shiny fileInput - 反斜杠导致上传错误

时间:2015-03-18 21:47:04

标签: r file-io shiny backslash

我在使用fileInput在R Shiny中遇到困难。我能够成功上传多个.txt或.csv文件,但我希望我的应用程序能够上传一个名为“.fcs”文件的文件类型。为了读取这样的“.fcs”文件,我使用了bioConductor包下的库flowCore。在这个flowcore包中,有一个名为read.FCS的函数,我经常用它来读入“.fcs”文件到R.

read.FCS()函数的第一个参数是文件位置的字符串。这就是我的问题所在:因为函数需要将文件路径放在charcater字符串中,fileInput()生成的数据路径中的反斜杠不会与read.FCS所期望的字符串相互作用(例如,当我打印时)从fileInput获取的数据路径,Shiny返回类似于:... \ AppData \ Local \ Temp \ Rtm ... PdV / 99 ... 42/0 - 注意前向和反斜杠)。

我的问题是:有没有办法修改数据路径不包含反斜杠,以便read.FCS()函数可以正常工作?

为了说明这个问题,我将在下面附加我的脚本的简化版本用于调试目的,以及生成.txt文件和.fcs文件的方法(必须首先安装软件包flowCore)。您将能够将这两个读入R,但.fcs文件将无法读入Shiny应用程序。启动闪亮后,当您选择“.txt”文件类型选项并上传示例.txt文件(在下面生成)时,Shiny会对此文件进行处理。当您重新启动应用程序并选择“.fcs”文件类型选项并上传示例.fcs文件(在下面生成)时,该文件无法正确上载。

起初我认为这是Shiny在上传后以某种方式破坏了FCS文件。但这种情况并非如此。作为prrof,在mainTab区域中,您将看到打印的文件路径。如果您复制此文件路径(当您尝试加载fcs文件时),将其放在引号中并将其放入read.FCS(在此处插入带引号的复制文件路径),您将收到错误。另一方面,如果在read.FCS命令中将所有“\”替换为“/”并再次尝试,则R将成功读取上传到Shiny的文件。因此,我被认为如果我能以某种方式用文件路径中的“/”替换“\”,我将能够读取我的FCS文件。

非常感谢你的帮助 - 我真的很感激:下面的示例代码

install.packages(flowCore)
library(flowCore)

x = rnorm(n=20, mean=5, sd=10)
y = rnorm(n=20, mean=5, sd=10)
z = rnorm(n=20, mean=5, sd=10)
data<-data.frame(as.integer(x),as.integer(y),as.integer(z))
my_save_path<-"C:/Users/drew/Desktop/"
write(as.matrix(data), paste(my_save_path, "sample_textfile.txt", sep=""), ncolumns=3, sep="\t")
df.export<-new("flowFrame", as.matrix(data))
write.FCS(df.export, paste(my_save_path, "sample_fcsfile.fcs", sep=""))
#write.fcs is experimental, but the problem persists for raw .fcs files from other sources other than this export.

#####Verify that these files are real and can be looked at in r

txt.real<-read.delim(paste(my_save_path,"sample_textfile.txt", sep=""))
txt.real #yup, reading into R works

fcs.real<-read.FCS( paste(my_save_path, "sample_fcsfile.fcs", sep=""), transform=FALSE)
fcs.real<-exprs(fcs.real)
fcs.real #yup, this is real too

用户界面

shinyUI(navbarPage("App",
tabPanel("Overview",
                            sidebarLayout(
                              sidebarPanel("Load in Data",
                                           selectInput("filetype", label = h3("File Type"), 
                                                       choices=list(".fcs file", ".txt file"), selected=".txt file"),
                                           fileInput("files", h3("File(s) Input"))),
                              mainPanel(
                                tableOutput("table1"),
                                textOutput("text")                                
                              )))
))

服务器

library(flowCore)

shinyServer(function(input, output) {

  fileName<-reactive({
    inFile <- input$files
    inFile$datapath
  })

  dataInput<-reactive({

    if(input$filetype==".fcs file"){
      library(flowCore)
      FCS<-read.FCS(fileName(), transform=FALSE)
      exprs(FCS)

    }

    if(input$filetype==".txt file") {
      TXT<-read.delim(fileName())
      TXT
    }
 })

  ####Heading the Table (debug)  
  output$table1<-renderTable({
    if (is.null(input$files))
      return(NULL)

    head(dataInput())

  })

  #Seeing the file path
  output$text<-renderText({
    x<-fileName()
    x
  })

}
)

0 个答案:

没有答案