2010-06-10 38 views
16

Có công cụ nào (trình soạn thảo, tập lệnh, bất kỳ thứ gì ...) có sẵn có thể tự động định dạng lại mã R không? Nó không cần phải được tùy chỉnh nhưng nó phải có khả năng nhận ra các câu lệnh được phân tách bằng dấu chấm phẩy hoặc dòng mới vì mã này có cả hai. Nếu nó có thể đặt tất cả các tuyên bố trên một dòng riêng biệt, nhất quán khối mã thụt lề và liên tục đặt niềng răng, tôi sẽ rất hạnh phúc.để tự động định dạng mã R

Edit: tóm tắt những phát hiện

Cảm ơn câu trả lời tuyệt vời. Đây là những gì tôi đã tìm thấy.

  • Cả ESS và Statet đều là trình chỉnh sửa R tuyệt vời và thực hiện tốt công việc tự động chặn các khối mã. Statet cho phép bạn chọn tất cả và thụt lề lại mọi thứ trong một tệp cùng một lúc. Từ những gì tôi có thể cho biết ESS cho phép bạn thụt lề toàn bộ chức năng def cùng một lúc nhưng không phải toàn bộ tập tin (hãy sửa tôi nếu tôi bỏ lỡ nó). Không ai trong số này sẽ sửa chữa vị trí cú đúp hoặc phá vỡ các dòng đa tuyên bố. (Ví dụ: i = n * b; a = i + 1)
  • định dạngR thật tuyệt vời. Ngoài việc sửa chữa thụt đầu dòng, nó cũng sẽ đặt niềng răng nhất quán và phân chia các dòng đa tuyên bố.

Dưới đây là một chức năng nhỏ mà tôi đã viết để tôi có thể chuyển đổi toàn bộ thư mục nguồn (sử dụng cùng chức năng cơ bản như định dạngR, điều lạ lùng trong gói hoạt ảnh).

library("animation") 

tidy.all <- function(inDir = NULL, outDir = NULL, ...) { 
    if (is.null(inDir) || is.na(outDir)) 
     stop("inDir can't be null or NA") 
    if (!file.info(inDir)$isdir) 
     stop("inDir must be a directory") 

    if (is.null(outDir) || is.na(outDir)) 
     stop("outDir can't be null or NA") 
    if (!file.exists(outDir)) 
     dir.create(outDir) 
    if (!file.info(outDir)$isdir) 
     stop("outDir must be a directory") 

    for (f in dir(inDir)) { 
     currFile <- file.path(inDir, f) 
     if (length(grep(".*\\.R$", currFile, perl = T))) { 
      outFile <- file.path(outDir, f) 
      if (file.exists(outFile)) 
       stop(paste("refusing to overwrite", outFile)) 

      tidy.source(currFile, file = outFile, ...) 
     } 
    } 
} 
+1

Tôi viết "mã đẹp" ngay từ đầu vì tôi thấy dễ đọc hơn. Tôi sử dụng plugin StatET cho Eclipse (tôi đã thử ESS nhưng tôi thấy nó có thể so sánh với Statet), điều này hoàn toàn thỏa đáng cho công việc của tôi. –

+0

@romunov có, tôi đồng ý nhưng hầu hết mã R mà tôi phải sửa đổi ban đầu không được tạo bởi tôi – Keith

+0

Keith, điểm tốt. Trong trường hợp đó, tôi tìm định dạng giống như một tùy chọn tuyệt vời (như bạn đã khám phá ra). –

Trả lời

9

Mặc dù ESS là một giải pháp lâu dài tốt hơn nhiều, nếu bạn chỉ có một công việc định dạng nhanh, có lẽ gói này sẽ giúp: http://yihui.name/en/?s=formatr.

7

Emacs với ESS làm nó cực tốt - thiết lập và mặc định theo khuyến cáo của R cốt lõi là ở Section 7 R coding standards của cuốn cẩm nang R Internals.

+0

Làm thế nào để bạn làm điều đó trong tiểu luận? – qed

+1

http://ess.r-project.org/Manual/ess.html#Indenting –

+0

Tuyệt vời. Đây là về các kiểu mã được đặt. Nếu mã hơi lộn xộn, có lệnh nào để làm sạch định dạng không? – qed

6

Tôi sử dụng StatET và hoạt động khá tốt cho việc này.

Bạn cũng có thể thử the formatR package trên CRAN.

+1

Bạn làm điều đó như thế nào trong StatET, vui lòng? Tôi không thể tìm thấy tùy chọn cho nó. – qed

0

Bạn có thể sử dụng ctrl + I trong statet để sửa lỗi thụt lề của mã. Tuy nhiên, có thể sử dụng gói formatR với đoạn mã tạo ra kết quả tốt hơn, đặc biệt bằng cách gán một phím nóng cho nó.

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