Memvalidasi input
Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 55 dari 64.
Input dari pengguna atau file berupa teks dan bisa berisi apa saja. Periksa sebelum menggunakannya: suppressWarnings(as.numeric(s)) menghasilkan NA untuk teks yang bukan angka, dan is.na() mengujinya:
read_age <- function(s) {
n <- suppressWarnings(as.numeric(s))
if (is.na(n)) return("not a number")
if (n < 0 || n > 130) return("out of range")
paste("age", n)
}
print(read_age("36"))
print(read_age("abc"))
print(read_age("200"))Output:
[1] "age 36"
[1] "not a number"
[1] "out of range"Validator dapat mengumpulkan semua masalah tanpa berhenti pada masalah pertama, sehingga memberikan umpan balik yang lebih berguna. Di sini, validator mengembalikan vector berisi pesan, yang kosong jika input sudah benar:
check_password <- function(p) {
problems <- c()
if (nchar(p) < 8) problems <- c(problems, "too short")
if (!grepl("[0-9]", p)) problems <- c(problems, "needs a digit")
problems
}
print(check_password("abc"))
print(length(check_password("secret123")))Output:
[1] "too short" "needs a digit"
[1] 0Pilih gayanya berdasarkan siapa yang memanggil fungsi: kembalikan pesan ketika pemanggil mengharapkan input yang tidak valid dan menampilkannya kepada pengguna; picu error dengan stop() ketika input yang tidak valid menandakan bug yang tidak boleh luput dari perhatian.
# pemanggil mengantisipasi input yang tidak valid dan menampilkan pesannya
read_age("abc") # "not a number"
# input yang tidak valid adalah kesalahan dalam program
if (!is.numeric(x)) stop("x must be numeric")Validasi dengan tryCatch() di sekitar langkah parsing membuat kode utama bebas dari pemeriksaan: setiap record dikonversi atau dilaporkan:
parse_record <- function(line) {
parts <- strsplit(line, ",")[[1]]
if (length(parts) != 2) stop("expected 2 fields")
qty <- suppressWarnings(as.integer(parts[2]))
if (is.na(qty)) stop("quantity is not a whole number")
list(item = parts[1], qty = qty)
}
for (line in c("tea,2", "jam", "oil,x")) {
r <- tryCatch(parse_record(line), error = function(e) conditionMessage(e))
cat(line, ":", if (is.list(r)) paste("ok", r$qty) else r, "\n")
}Output:
tea,2 : ok 2
jam : expected 2 fields
oil,x : quantity is not a whole number Tantangan
MudahLengkapi check_signup(name, age, email). Kumpulkan semua masalah, dalam urutan ini: name is empty (setelah menghapus spasi di kedua ujung), age must be a number, age must be 13 or older (hanya jika usia berupa angka), dan email needs @. Kembalikan ok jika tidak ada masalah, jika tidak, gabungkan masalah dengan ; .
Kode yang disediakan membaca nama, usia, dan email (masing-masing satu baris), lalu mencetak nilai yang dikembalikan.
Coba sendiri
check_signup <- function(name, age, email) {
# Tulis kodemu di sini
"ok"
}
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), sep = "\n")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami string
Substring dengan substr()Memformat dengan sprintf()Memisahkan dan MenggabungkanMencari stringMengganti TeksRangkuman: Pembuat Nama Pengguna4Matriks
Membuat MatriksMengakses Elemen MatriksRingkasan Baris dan KolomAritmetika MatriksRangkuman: Denah Tempat Duduk2Pencarian Nilai-Kunci
Pencarian pada Vector BernamaMemeriksa KunciMenambahkan dan Menghapus KunciMenelusuri NamaUlasan: Meja Saham5Proyek, Buku Nilai
Menambahkan SiswaMencatat Nilai8Pengurutan dan Pengelompokan
Mengurutkan VektorMengurutkan berdasarkan KunciMengelompokkan dengan split()Ringkasan KelompokUlasan: Papan Peringkat11Penanganan error
Memunculkan error dengan stop()Menangani error dengan tryCatch()Peringatan dan finallyMemvalidasi inputRangkuman: Kalkulator Aman3Set dan Penghitungan
Nilai UnikOperasi setPengujian KeanggotaanMenghitung dengan table()Ulasan: Tamu Acara6Fungsi sebagai Nilai
Fungsi AnonimMengirim FungsiMengembalikan FungsiClosure dengan StateRangkuman: Aturan Diskon9Data Frame
Membuat Data FrameKolom dan BarisMemfilter BarisMenambahkan dan MengurutkanRangkuman: Laporan Penjualan12Proyek: Pelacak Pengeluaran
Mencatat PengeluaranTotal PengeluaranLatihan sendiri: Compiler R online