2013-05-21 2 views
0

저는 여전히 R에 익숙하며 for-loops와 함수에 대해 매우 새롭지 만, stackoverflow에서 상당히 검색하여 대답을 찾을 수 없습니다 이 질문에. 그래서 여기에 우리가 간다.for-loop 내에서 'i'라는 이름의 객체에 함수를 실행 중입니다. R

(1) 여러 .csv 파일을 읽고 (2) URL에서 트위터 핸들을 제거하는 기능을 적용하고 이러한 파일에 다른 작업을 수행하려고합니다. 이 두 가지 작업에 대한 스크립트를 별도로 개발했기 때문에 대부분의 코드가 제대로 작동한다는 것을 알았지 만 결합하려고하면 문제가 발생합니다. 다음 코드를 사용하여 준비합니다.

# specify directory for your files and replace 'file' with the first, unique part of the 
# files you would like to import 
mypath <- "~/Users/you/data/" 
mypattern <- "file+.*csv" 

# Get a list of the files 
file_list <- list.files(path = mypath, 
         pattern = mypattern) 

# List of names to be given to data frames 
data_names <- str_match(file_list, "(.*?)\\.")[,2] 

# Define function for preparing datasets 
handlestripper <- function(data){ 
    data$handle <- str_match(data$URL, "com/(.*?)/status")[,2] 
    data$rank <- c(1:500) 
    names(data) <- c("dateGMT", "url", "tweet", "twitterid", "rank") 
    data <- data[,c(4, 1:3, 5)] 
} 

모두 제대로 작동합니다. for 루프 내에서 handlestripper() 함수를 실행하려고하면 문제가 발생합니다.

# Read in data 
for(i in data_names){ 
    filepath <- file.path(mypath, paste(i, ".csv", sep = "")) 
    assign(i, read.delim(filepath, colClasses = "character", sep = ",")) 
    i <- handlestripper(i) 
} 

이 코드를 실행하면 Error in data$URL : $ operator is invalid for atomic vectors 오류가 발생합니다. 이 함수가 벡터 내에서 호출 한 문자열 data_names에 적용된다는 것을 알지만, for 루프의이 마지막 줄에서 R에 적용 할 함수를 원한다는 것을 어떻게 알 수 있는지 알 수 없습니다. 개체 그 자체가 아니라 assign 명령을 사용하여 방금 만든 이름의입니다. 루프 내부

+0

'assign' 호출이 에러를 던지지 않는다는 것에 조금 놀랐습니다. 일반적으로 값 대신 인덱스를 반복하지 않는 것이 더 일반적입니까? – joran

+0

R 개체 인 루프 인덱스가 엉망입니다. 나쁜 습관처럼 보입니다. 'sapply'를 사용하는 것이 더 쉬울 수도 있습니다. –

+0

'get'은'handlestripper (get (i)) '에서와 같이 문제를 해결할 수 있습니다 ... 그러나 DWin과 joran은 해결되어야 할 더 큰 문제를 지적합니다! – Justin

답변

0

,이를 변경할 수 있습니다

assign(i, read.delim(filepath, colClasses = "character", sep = ",")) 
i <- handlestripper(i) 

tmp <- read.delim(filepath, colClasses = "character", sep = ",") 
assign(i, handlestripper(tmp)) 

에 당신이 적은 getassign 통화를해야한다고 생각 색인 아무 문제가 없습니다 당신이 할 수 있지만,로 당신이하고있는 것처럼 이름을 가지고 반복하십시오. 어쨌든 나는 항상 그렇게한다.

+0

거의 - 내 코드의 마지막 줄은'assign (i, handlestripper (tmp))'를 읽어 루프 출력이 이름 i의 데이터 프레임이되도록합니다. – lish

+0

죄송합니다. 내 제안을 잘못 복사했습니다. :) 그것을 지적 해 주셔서 감사합니다. – Frank

관련 문제