Мне кажется, простой ответ - просто скопировать и изменить исходный код modfiyList()
, чтобы удалить его рекурсивную часть:
modify_list_nonrecursive <- function (x, val, keep.null = FALSE) {
stopifnot(is.list(x), is.list(val))
xnames <- names(x)
vnames <- names(val)
vnames <- vnames[nzchar(vnames)]
if (keep.null) {
for (v in vnames) {
x[v] <- val[v]
}
}
else {
for (v in vnames) {
x[[v]] <- val[[v]]
}
}
return(x)
}
default.options <- list(a = 1, b = 2, c = "hello", fixed = list(a = 1))
user.options <- list(b = 3, e = 0, fixed = list())
opts <- modifyList(default.options, user.options)
dput(opts)
# list(a = 1, b = 3, c = "hello", fixed = list(a = 1), e = 0)
opts <- modify_list_nonrecursive(default.options, user.options)
dput(opts)
# list(a = 1, b = 3, c = "hello", fixed = list(), e = 0)
Исходный код modifyList()
был
modifyList
function (x, val, keep.null = FALSE)
{
stopifnot(is.list(x), is.list(val))
xnames <- names(x)
vnames <- names(val)
vnames <- vnames[nzchar(vnames)]
if (keep.null) {
for (v in vnames) {
x[v] <- if (v %in% xnames && is.list(x[[v]]) && is.list(val[[v]]))
list(modifyList(x[[v]], val[[v]], keep.null = keep.null))
else val[v]
}
}
else {
for (v in vnames) {
x[[v]] <- if (v %in% xnames && is.list(x[[v]]) &&
is.list(val[[v]]))
modifyList(x[[v]], val[[v]], keep.null = keep.null)
else val[[v]]
}
}
x
}
Итак, вы можете видеть, что вам просто нужно удалить некоторые условные выражения с помощью рекурсивных вызовов, и все работает просто отлично!