2016-05-15 41 views
0
readStateData <- function() { 
    infile <- paste("state",i,".txt",sep="") 
    state <- readLines(infile,n=1) 
    statedata <- read.table(infile,header=FALSE,sep=",",skip=1,col.names=c("Rank","City","Population")) 
    statename <- list(state,statedata) 
    statename 
} 

# Start loop 

for(i in 1:50) { 
    readStateData() 
    # Add function to big.list 
    big.list[[i]] <- readStateData(statename) 
} 

类的分配是通过readlines方法在50个文件带来,所有命名状态#txt文件,得到了国家,通过读取获取数据。表,并最终将其全部放入big.list中,通过for循环将所有数据。试图调用一个函数的循环,让未使用的参数错误

我遇到的问题是在for循环中调用函数。我得到的错误:

Error in readStateData(statename) : unused argument (statename) 

我要么没有正确调用函数,要么写错了函数。两者都可能。

谢谢你的帮助。

回答

0

你在这里有不同的问题。

  1. 不要在函数内引用外部定义的变量。这意味着,而不是函数外部函数中定义i访问的:

    i <- 1 
    fct <- function() { 
        a <- i + 1 
        return(a) 
    } 
    fct() 
    

    传递变量作为自变量的函数:

    i <- 1 
    fct <- function(x) { 
        a <- x + 1 
        return(a) 
    } 
    fct(i) 
    
  2. 在你的函数的返回语句丢失。请参阅第1点在功能中的最后一个命令。没有返回语句,最后一个写入的变量在堆栈中,并由函数“返回”。这不是返回值的干净方式。

人体工程学你的代码看起来应该是这样

readStateData <- function(x) { 
    infile <- paste("state",x,".txt",sep="") 
    state <- readLines(infile,n=1) 
    statedata <-read.table(infile,header=FALSE,sep=",",skip=1,col.names=c("Rank","City","Population")) 
    statename <- list(state,statedata) 
    return(statename) 
} 

# Start loop 

for(i in 1:50) { 
    j <- readStateData(i) 
    # Add function to big.list 
    big.list[[i]] <- j 
} 

如果你的文件全部模式:状态[数字] .TXT您可以简化代码:

# Get all files with pattern state*.txt 
fls <- dir(pattern='state.*txt') 

readStateData <- function(x) { 
    state <- readLines(x, n=1) 
    statedata <-read.table(x, header=FALSE,sep=",",skip=1,col.names=c("Rank","City","Population")) 
    statename <- list(state,statedata) 
    return(statename) 
} 

# Start loop 

for(i in 1:length(fls)) { 
    j <- readStateData(fls[i]) 
    # Add function to big.list 
    big.list[[i]] <- j 
} 
+0

的你解释这些功能的方式比我的教授解释他们时更有意义。谢谢。 然而,当我运行的代码版本,我得到这个错误: 错误文件(CON,“R”):无效“说明”的说法 谷歌搜索似乎暗示它的读取文件的名字写错了,但我已经设置(通过setwd)到正确的目录。 – Ashley

+0

现在我知道你想做什么!我改变了答案。现在它应该工作! – FlorianSchunke

+0

你太棒了!对不起,我没有更好地描述这个问题。 – Ashley