ฉันชอบpurrr::when
และโซลูชันพื้นฐานอื่น ๆ ที่มีให้ที่นี่นั้นยอดเยี่ยมมาก แต่ฉันต้องการบางอย่างที่กะทัดรัดและยืดหยุ่นมากขึ้นดังนั้นฉันจึงออกแบบฟังก์ชันpif
(ไปป์ if) ดูโค้ดและเอกสารในตอนท้ายของคำตอบ
ข้อโต้แย้งที่สามารถแสดงออกของการทำงานอย่างใดอย่างหนึ่ง (สัญกรณ์สูตรได้รับการสนับสนุน) FALSE
และการป้อนข้อมูลจะถูกส่งกลับไม่เปลี่ยนแปลงโดยค่าเริ่มต้นถ้าเงื่อนไขเป็น
ใช้กับตัวอย่างจากคำตอบอื่น ๆ :
data.frame(a=1:2) %>%
mutate(b=a^2) %>%
pif(~b[1]>1, ~mutate(.,b=b^2)) %>%
mutate(b=b^2)
1:3 %>% pif(sum(.) < 25,sum,0)
1 %>% pif(TRUE,~. + 1) %>% `*`(2)
1 %>% `+`(1) %>% pif(TRUE ,~ .+1)
ตัวอย่างอื่น ๆ :
iris %>% pif(is.data.frame, dim, nrow)
iris %>% pif(~is.numeric(Species),
~"numeric :)",
~paste(class(Species)[1],":("))
iris %>% pif(nrow(.) > 2, head(.,2))
iris %>% pif(TRUE, dim, warning("this will be evaluated"))
iris %>% pif(TRUE, dim, ~warning("this won't be evaluated"))
ฟังก์ชัน
pif <- function(x, p, true, false = identity){
if(!requireNamespace("purrr"))
stop("Package 'purrr' needs to be installed to use function 'pif'")
if(inherits(p, "formula"))
p <- purrr::as_mapper(
if(!is.list(x)) p else update(p,~with(...,.)))
if(inherits(true, "formula"))
true <- purrr::as_mapper(
if(!is.list(x)) true else update(true,~with(...,.)))
if(inherits(false, "formula"))
false <- purrr::as_mapper(
if(!is.list(x)) false else update(false,~with(...,.)))
if ( (is.function(p) && p(x)) || (!is.function(p) && p)){
if(is.function(true)) true(x) else true
} else {
if(is.function(false)) false(x) else false
}
}