2015-05-15 19 views
5

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?

+1

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. –

+0

@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

+1

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. –

Trả lời

2

Đây là chi tiết R-thành ngữ:

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") 
output <- paste('output_', u.files, sep='') 
comm <- paste('cdo merge', u.files, v.files, output) 
lapply(comm,system) 

Hãy nhớ rằng hầu hết các chức năng được vector hóa trong R, vì vậy bạn không cần phải gọi paste cho mỗi lần lặp trong vòng lặp. Cuối cùng, bạn có được một vectơ các lệnh và thực thi từng lệnh một thông qua lapply ở dòng cuối cùng.

Các vấn đề liên quan