Mục tiêu học tập hiện tại của tôi trong R là tránh các vòng for
. Tôi thường phải liệt kê các tập tin trong một thư mục (hoặc vòng qua các thư mục) để thực hiện các thao tác đa dạng trên các tệp đó.R - Cách tránh vòng lặp trong danh sách các tệp
Một ví dụ về nhiệm vụ của tôi là như sau: Tôi phải gọi một ứng dụng hệ thống được gọi là cdo
để hợp nhất hai tệp. Cú pháp của lệnh này, giả sử: cdo merge input_file1 input_file2 output_file
.
đang R hiện tại của tôi trông như thế này:
# set lists of files
u.files <- c("uas_Amon_ACCESS1-3.nc", "uas_Amon_CMCC-CESM.nc", "uas_Amon_CMCC-CESM.nc")
v.files <- c("vas_Amon_ACCESS1-3.nc", "vas_Amon_CMCC-CESM.nc", "vas_Amon_CMCC-CESM.nc")
for (i in 1:length(u.files)) {
# set input file 1 to use on cdo
input1 <- paste(u.files[i], sep='')
# set input file 2 to use on cdo
input2 <- paste(v.files[i], sep='')
# set output file to use on cdo
output <- paste('output_', u.files[i], sep='')
# assemble the command string
comm <- paste('cdo merge', input1, input2, output, collapse='')
# submit the command
system(comm)
}
mà làm việc ok mặc dù trông không phải là tốt.
Tuy nhiên, tôi thường nghe mọi người nói rằng các vòng lặp for
trong R chậm và cần tránh càng nhiều càng tốt.
Có cách nào để tránh các vòng lặp và làm cho mã hiệu quả hơn/dễ đọc hơn trong các trường hợp như thế này không?
Tại đây, bạn chỉ sử dụng R để chạy công cụ hệ thống (ví dụ: cdo). Theo quan điểm của tôi, nó có thể hiệu quả hơn để trực tiếp sử dụng một kịch bản lệnh shell. –
@Pascal, mã này thực sự là một đoạn trích. Trong thực tế, tôi có nhiều thứ hơn đi một bên trong vòng lặp cho đến khi nó được đến thời điểm này. Nhưng tất cả các lệnh khác cũng liên quan đến việc lập chỉ mục trong vòng lặp, vì vậy nếu tôi hiểu được logic đằng sau việc loại bỏ vòng lặp, tôi sẽ có thể sử dụng nó trong tập lệnh thực tế của mình. – thiagoveloso
Tôi chỉ báo hiệu bạn có thể đơn giản hóa mã R của bạn bằng cách loại bỏ tất cả các cuộc gọi hệ thống unnessary, bằng cách prepocessing. Nhưng tất nhiên, điều đó tùy thuộc vào bạn. –