Saya telah menemukan pernyataan ifelse R cukup berguna dari waktu ke waktu. Sebagai contoh:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
Tapi saya agak bingung dengan perilaku berikut.
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
Apakah ini pilihan desain di atas tingkat pembayaran saya?
r
if-statement
r-faq
Christopher DuBois
sumber
sumber
Jawaban:
Dokumentasi untuk
ifelse
negara bagian:Karena Anda melewati nilai tes panjang 1, Anda mendapatkan hasil panjang 1. Jika Anda melewati vektor uji yang lebih panjang, Anda akan mendapatkan hasil yang lebih panjang:
Jadi
ifelse
dimaksudkan untuk tujuan khusus menguji vektor boolean dan mengembalikan vektor dengan panjang yang sama, diisi dengan elemen yang diambil dari (vektor)yes
danno
argumen.Ini adalah kebingungan umum, karena nama fungsinya, untuk menggunakan ini ketika Anda sebenarnya hanya menginginkan
if () {} else {}
konstruksi normal .sumber
if (TRUE) c(1,2) else c(3,4)
.Saya yakin Anda menginginkan
if
pernyataan sederhana daripadaifelse
- di R,if
bukan hanya struktur aliran kontrol, ini dapat mengembalikan nilai:sumber
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
apa yang harus saya lakukan untuk menyingkirkan peringatan ini?req(inputval)
memiliki lebih banyak elemen. Untuk mendapatkan satu nilai fungsiany()
atauall()
mungkin berguna.Perhatikan bahwa Anda dapat menghindari masalah jika Anda menetapkan hasilnya di dalam
ifelse
:sumber
ifelse()
fungsi vektor di tempat aliran kontrolif ... else ...
untuk tugas. Jika kondisinya adalah satuTRUE
atauFALSE
nilai, saya lebih suka menulisa <- if (TRUE) c(1,2) else c(3,4)
atauif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
alih-alihif
...else
dalam kasus satu kondisi benar-benar dapat menjadi masalah danifelse
mungkin lebih disukai dalam beberapa kasus di dalam kode (tebakan sederhana di sini), saya tidak setuju dengan Anda ;-). Saya hanya ingin menunjukkan jalan denganifelse
.ya, saya pikir ifelse () benar-benar dirancang untuk saat Anda memiliki vektor pengujian yang besar dan ingin memetakan masing-masing ke salah satu dari dua opsi. Misalnya, saya sering membuat warna untuk plot () dengan cara ini:
Jika Anda memiliki vektor panjang besar tes tetapi ingin pasang untuk output, Anda bisa menggunakan
sapply()
atauplyr
s'llply()
atau sesuatu, mungkin.sumber
Terkadang pengguna hanya membutuhkan
switch
pernyataan, bukanifelse
. Dalam hal itu:(yang merupakan opsi sintaks lain dari jawaban Ken Williams)
sumber
Berikut adalah pendekatan yang serupa dengan yang disarankan oleh Cath, tetapi dapat bekerja dengan vektor yang telah ditetapkan sebelumnya
Ini didasarkan pada penggunaan
get()
seperti:sumber
gunakan `if`, mis
sumber
Dalam kasus Anda, menggunakan
if_else
fromdplyr
akan sangat membantu:if_else
lebih ketat daripadaifelse
, dan menimbulkan kesalahan untuk kasus Anda:sumber
Ditemukan di everydropr :
Dapat mereplikasi hasil kondisi Anda untuk mengembalikan panjang yang diinginkan
sumber