มีคำตอบที่ยอดเยี่ยมในบล็อกการดิ้นรนผ่านปัญหา
สิ่งนี้นำมาจากที่นั่นโดยมีการปรับเปลี่ยนเล็กน้อยมาก
การใช้ฟังก์ชันสามอย่างต่อไปนี้ (บวกหนึ่งเพื่ออนุญาตรายการที่มีขนาดแตกต่างกัน)
'%=%' = function(l, r, ...) UseMethod('%=%')
'%=%.lbunch' = function(l, r, ...) {
Envir = as.environment(-1)
if (length(r) > length(l))
warning("RHS has more args than LHS. Only first", length(l), "used.")
if (length(l) > length(r)) {
warning("LHS has more args than RHS. RHS will be repeated.")
r <- extendToMatch(r, l)
}
for (II in 1:length(l)) {
do.call('<-', list(l[[II]], r[[II]]), envir=Envir)
}
}
extendToMatch <- function(source, destin) {
s <- length(source)
d <- length(destin)
if(d==1 && s>1 && !is.null(as.numeric(destin)))
d <- destin
dif <- d - s
if (dif > 0) {
source <- rep(source, ceiling(d/s))[1:d]
}
return (source)
}
g = function(...) {
List = as.list(substitute(list(...)))[-1L]
class(List) = 'lbunch'
return(List)
}
จากนั้นเพื่อดำเนินการ:
จัดกลุ่มทางซ้ายมือโดยใช้ฟังก์ชันใหม่g()
ด้านขวามือควรเป็นเวกเตอร์หรือรายการใช้ตัวดำเนินการไบนารีที่สร้างขึ้นใหม่%=%
g(a, b, c) %=% list("hello", 123, list("apples, oranges"))
g(d, e, f) %=% 101:103
> a
[1] "hello"
> b
[1] 123
> c
[[1]]
[1] "apples, oranges"
> d
[1] 101
> e
[1] 102
> f
[1] 103
ตัวอย่างการใช้รายการขนาดต่างๆ:
ด้านซ้ายมืออีกต่อไป
g(x, y, z) %=% list("first", "second")
> x
[1] "first"
> y
[1] "second"
> z
[1] "first"
ด้านขวามืออีกต่อไป
g(j, k) %=% list("first", "second", "third")
> j
[1] "first"
> k
[1] "second"
list($a, $b) = array(1, 2)
? คงจะดีไม่น้อย! +1.