功能中的用户输入文件名-R

时间:2018-08-01 10:11:32

标签: r function file user-input

我想分别分析75个数据文件,但所有方法都相同。我为分析的每个步骤编写了函数。数据集基本上是这样的:

df = data.frame(
  Time = c(1, 2, 3, 4),
  Concentration = c(2983, 9848, 2894, 8384))

我要求用户提供文件名,我想在功能中输入所选的文件名。

enterFileName <- function(){ 
  filename <- readline(prompt="Enter file name: ")
  return(filename)}

对此我有两个问题:

  1. 是否可以编写代码,以便在运行该函数时使用该函数自动使用用户输入的文件名(使用之前创建的变量“ filename”)?因此,我不必每次都重复输入文件名。我试过了,但是没用:

    averageFun <- function(){
      summary(filename$Concentration)}
    
    enterFileName()
    averageFun()
    
    Error in summary(filename$Concentration) : object 'filename' not found
    
  2. 我可以使用用户为ggplot图表中的主标题输入的文件名吗?像这样...

    plotFirst <- function(df){
      ggplot(data = df, aes(x = Time, y = Number)) + geom_line() + 
        ggtitle("UFP concentrations raw data" + filename)
    }
    

这只会返回没有主标题的图形。

有人可以帮我吗?预先感谢!

2 个答案:

答案 0 :(得分:2)

enterFileName()没有副作用,您没有在工作区中创建任何名为filename的变量。

似乎您是在引用变量,将其称为文件名,这很令人困惑,但是您应该从这里找到自己的方式:

解决方案1,使用变量

df = data.frame(
  Time = c(1, 2, 3, 4),
  Concentration = c(2983, 9848, 2894, 8384))

enterFileName <- function(){ 
  filename <- readline(prompt="Enter file name: ")
  return(filename)}

averageFun <- function(filename){
  summary(get(filename)$Concentration)}

filename <- enterFileName() # we enter 'df' (without quotes)

averageFun(filename)
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 2894    2961    5684    6027    8750    9848

plotFirst <- function(df, filename){
  library(ggplot2)
  ggplot(data = df, aes(x = Time, y = Concentration)) + geom_line() + 
    ggtitle(paste("UFP concentrations raw data" ,filename))
}


plotFirst(df,filename)

解决方案2,使用选项

enterFileName <- function(){ 
  options(myproject.filename = readline(prompt="Enter file name: "))
  }

averageFun <- function(){
  summary(get(getOption("myproject.filename"))$Concentration)}

filename <- enterFileName() # we enter 'df' (without quotes)

averageFun()
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 2894    2961    5684    6027    8750    9848

plotFirst <- function(df){
  library(ggplot2)
  ggplot(data = df, aes(x = Time, y = Concentration)) + geom_line() + 
    ggtitle(paste("UFP concentrations raw data" ,getOption("myproject.filename")))
}

plotFirst(df,filename)

答案 1 :(得分:1)

两个问题的答案都是肯定的。

  1. 您要分析文件而不是文件名。因此,您必须为文件名创建新的函数,例如(例如,如果您的文件是csv文件):

所以您的平均值看起来像

    readFile <- function(filename) {
      file <- read.csv(file = paste0(filename, ".csv")
      return(file)
    }
averageFun <- function(filename){
      summary(readFile(filename)$Concentration)
    }
  1. 您必须在函数中添加filename参数

    plotFirst <- function(df, filename){
             ggplot(data = df, aes(x = Time, y = Number)) + geom_line() + 
             ggtitle("UFP concentrations raw data" + filename)
        }