저는 여전히 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 명령을 사용하여 방금 만든 이름의입니다. 루프 내부
'assign' 호출이 에러를 던지지 않는다는 것에 조금 놀랐습니다. 일반적으로 값 대신 인덱스를 반복하지 않는 것이 더 일반적입니까? – joran
R 개체 인 루프 인덱스가 엉망입니다. 나쁜 습관처럼 보입니다. 'sapply'를 사용하는 것이 더 쉬울 수도 있습니다. –
'get'은'handlestripper (get (i)) '에서와 같이 문제를 해결할 수 있습니다 ... 그러나 DWin과 joran은 해결되어야 할 더 큰 문제를 지적합니다! – Justin