Có một câu trả lời tuyệt vời trên Blog Đấu tranh Qua các Vấn đề
Điều này được lấy từ đó, với những sửa đổi rất nhỏ.
SỬ DỤNG BA CHỨC NĂNG SAU ĐÂY (Thêm một CHỨC NĂNG để cho phép danh sách các kích thước khác nhau)
'%=%' = 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)
}
Sau đó để thực hiện:
Nhóm bên tay trái bằng cách sử dụng hàm mới g()
Phía bên phải phải là vectơ hoặc danh sách Sử dụng toán tử nhị phân mới tạo%=%
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
Ví dụ sử dụng danh sách các kích thước khác nhau:
Bên tay trái dài hơn
g(x, y, z) %=% list("first", "second")
> x
[1] "first"
> y
[1] "second"
> z
[1] "first"
Dài hơn bên tay phải
g(j, k) %=% list("first", "second", "third")
> j
[1] "first"
> k
[1] "second"
list($a, $b) = array(1, 2)
? Thật là tốt! +1.