Untuk menggunakan pelbagai objekt tanpa mengulangi komando beberapa kali boleh dilakukan semada menggunakan loop atau salah satu cara apply. Masalahnya bila objekt-objekt disenaraikan sebagai vektor, objekt tersebut ditukarkan ke struktur chr. Oleh sebab itu objekt tersebut tidak dapat diproses seterusnya.

Salah satu penyelesaian masalah ini ialah menggunakan sapply. Akan tetapi ianya bergantung dengan penggunaan argument:

- `USE.NAME = TRUE`.
- `get()`

Contohnya, bila ingin menggunakan objekt2 ini di .GlobalEnv:

dt2000
dt2001
dt2002
dt2013
dt2014

Untuk dapatkan semua objekt-objekt diatas, boleh dikumpulkan menggunakan vector seperti begini:

objAll <- grep("^(dt200|dt201)*$", ls(), ignore.case = TRUE, value = TRUE)

objAll
[1] "dt2000" "dt2001" "dt2002" "dt2013" "dt2014"

Untuk mencapai objekt2 itu melalui objAll, boleh menggunakan sapply.

sapply(objAll, function(x) setDT(get(x)), USE.NAMES = TRUE)

Atau untuk menggunakan fungsi lain:

## Convert til excel
indK <- grep("^dt200", ls(), value = TRUE)
pathXL <- "~/Git-work/bdr/rapport/portal/excel/"
sapply(indK, function(x) write.xlsx(get(x), paste0(pathXL, x, ".xlsx")), USE.NAMES = TRUE)

Komando diatas menukarkan semua object di objAll ke data.table. Tanpa memakai USE.NAMES komando ini tidak akan berhasil kerana vector di objAll dibaca sebagai character. Selain itu penggunaan get juga penting untuk memastikan yang kandungan di objAll mempunyai nilai.

Contoh komando untuk dapatkan semua nama kolom sykehus di semua data.table. Penggunaan \\b diawal dan akhir perkataan ialah untuk menetapkan nama kolom betul-betul hanya sykehus tanpa tambahan contohnya inn_sykehus atau sykehus_2

sapply(objAll, function(x), grep("\\bsykehus\\b", names(get(x)), ignore.case = TRUE, value = TRUE), USE.NAMES = TRUE)
comments powered by Disqus