Nếu đây là tập lệnh của riêng bạn để bạn có quyền kiểm soát cách nó được định dạng thì một quy ước đơn giản sẽ là đủ. Chỉ cần đảm bảo rằng mỗi tên hàm bắt đầu từ ký tự đầu tiên trên dòng của nó và từ đó function
cũng xuất hiện trên dòng đó. Bất kỳ việc sử dụng nào khác của từ function
sẽ xuất hiện trên một dòng bắt đầu bằng khoảng trắng hoặc tab. Sau đó, một giải pháp một dòng là:
sub(" .*", "", grep("^\\S.*function", readLines("myscript.R"), value = TRUE))
Ưu điểm của phương pháp này là
nó là rất đơn giản . Các quy tắc được nêu đơn giản và chỉ có một dòng mã R đơn giản cần thiết để trích xuất các tên hàm. Regex cũng đơn giản và đối với một tệp hiện có, rất dễ kiểm tra - chỉ cần grep từ function
và kiểm tra xem mỗi lần xuất hiện được hiển thị có theo quy tắc hay không.
không cần chạy nguồn. Nó hoàn toàn tĩnh .
trong nhiều trường hợp, bạn sẽ không cần phải thay đổi tệp nguồn và trong những trường hợp khác sẽ có những thay đổi tối thiểu. Nếu bạn đang viết kịch bản từ đầu với ý nghĩ này thì việc sắp xếp lại càng dễ dàng hơn.
Có nhiều lựa chọn thay thế khác cùng với ý tưởng về các quy ước. bạn có thể có một biểu thức chính quy phức tạp hơn hoặc bạn có thể thêm # FUNCTION
vào cuối dòng đầu tiên của bất kỳ định nghĩa hàm nào nếu bạn đang viết tập lệnh từ đầu và sau đó rút ra cụm từ đó và trích xuất từ đầu tiên trên dòng nhưng dường như gợi ý chính ở đây đặc biệt hấp dẫn do tính đơn giản của nó và các lợi thế khác được liệt kê.
Kiểm tra
# generate test file
cat("f <- function(x) x\nf(23)\n", file = "myscript.R")
sub(" .*", "", grep("^\\S.*function", readLines("myscript.R"), value = TRUE))
## [1] "f"
source()
, nhưng chủ đề cũ này có thể được bạn quan tâm.