Di R, saya menggunakan source()
untuk memuat beberapa fungsi:
source("functions.R")
Apakah mungkin untuk mendapatkan daftar semua fungsi yang didefinisikan dalam file ini? Sebagai nama fungsi. (Mungkin source()
sendiri entah bagaimana dapat mengembalikannya?).
PS: Cara terakhir adalah memanggil source()
kedua kalinya seperti local({ source(); })
dan kemudian melakukan ls()
fungsi-fungsi di dalam dan menyaring, tapi itu terlalu rumit - apakah ada solusi yang lebih mudah dan kurang canggung?
source()
, tetapi utas lama ini mungkin menarik bagi Anda.envir <- new.env() source("functions.R", local=envir) lsf.str(envir)
Jawaban:
Saya pikir cara terbaik adalah dengan sumber file ke lingkungan sementara. Permintaan lingkungan itu untuk semua fungsi, lalu salin nilai-nilai itu ke lingkungan induk.
sumber
new.env()
alih-alih eleganlocal({ })
yang saya tidak yakin apakah itu akan berhasil denganassign
kerangka orangtua.local()
? Dan BTW, 2) apa yang Anda lakukan dalam for loop: apakah tidak ada fungsi untuk menggabungkan lingkungan?attach
dapat digunakan untuk, dengan baik, melampirkan satu lingkungan ke yang lain. Meskipun Anda harus menggunakanpos
argumen daripada menentukanparent.frame
. Dan itu hanya akan berfungsi dengan baik untuk menyalin seluruh lingkungan,for
loop MrFlick memungkinkan Anda hanya menyalin fungsi.Agak kikuk tetapi Anda bisa melihat perubahan pada objek sebelum dan sesudah
source
panggilan seperti ini.sumber
Saya pikir regex ini menangkap hampir setiap jenis fungsi yang valid (operator biner, fungsi penugasan) dan setiap karakter yang valid dalam nama fungsi, tetapi saya mungkin telah melewatkan case edge.
sumber
.
dan fungsi penugasan (`foo<-`<- function(x, value)
ada.=
untuk penugasan, ini tidak akan menangkap fungsi saya ...` d d` <- function(x)
yang saat ini tidak tertangkap. Saya tidak ingin regex terlalu konyol, meskipun saya mungkin mengunjungi kembali.assign
,<<-
, dan->
. Dan akan sangat sulit untuk membuat pendekatan ini memperhitungkan fungsi-fungsi yang didefinisikan dalam fungsi, tetapi sebenarnya tidak ada di lingkungan bersumber. Jawaban Anda harus bekerja dengan baik untuk kasus standar, tetapi Anda sebenarnya tidak ingin menulis p parser dari regex.Jika ini adalah skrip Anda sendiri sehingga Anda memiliki kendali atas cara memformatnya, konvensi sederhana akan cukup. Pastikan saja setiap nama fungsi dimulai pada karakter pertama pada barisnya dan bahwa kata tersebut
function
juga muncul pada baris tersebut. Penggunaan kata lainfunction
akan muncul pada baris yang dimulai dengan spasi atau tab. Maka solusi satu baris adalah:Keuntungan dari pendekatan ini adalah bahwa
ini sangat sederhana . Aturan hanya dinyatakan dan hanya ada satu baris sederhana kode R yang diperlukan untuk mengekstrak nama fungsi. Regex juga sederhana dan untuk file yang sudah ada sangat mudah untuk memeriksa - cukup ambil kata
function
dan periksa apakah setiap kemunculan yang ditampilkan mengikuti aturan.tidak perlu menjalankan sumbernya. Itu sepenuhnya statis .
dalam banyak kasus Anda tidak perlu mengubah file sumber sama sekali dan dalam kasus lain akan ada perubahan minimal. Jika Anda menulis skrip dari awal dengan mengingat hal ini, bahkan lebih mudah untuk mengaturnya.
Ada banyak alternatif lain di sepanjang gagasan konvensi. Anda dapat memiliki regex yang lebih canggih atau Anda dapat menambahkan
# FUNCTION
di akhir baris pertama dari definisi fungsi apa pun jika Anda menulis skrip dari awal dan kemudian mengeluarkan frasa itu dan mengekstrak kata pertama pada baris tersebut tetapi saran utama di sini tampaknya sangat menarik karena kesederhanaannya dan kelebihan lainnya yang tercantum.Uji
sumber
lapply(x, function(y) dostuff(y))
akan mematahkan ini# TODO
seluruh kode saya sehingga saya dapat memahami apa yang harus saya lakukan, misalnya. Kemungkinan lain di sepanjang baris yang sama adalah menulis# FUNCTION
di akhir baris pertama dari setiap definisi fungsi.Ini mengadaptasi kode yang digunakan dalam posting dari komentar saya untuk mencari urutan token (simbol, operator penugasan, kemudian berfungsi), dan harus mengambil fungsi yang telah ditentukan. Saya tidak yakin apakah itu kuat seperti jawaban MrFlick, tetapi itu adalah pilihan lain:
sumber