style graphs examples ejemplos best apps app r variable-assignment infix-operator

graphs - Asignar un valor a un elemento de la lista usando `assign()`



shiny pdf (1)

Un poco de contexto primero ...

He escrito una función de infijo que en esencia reemplaza el lenguaje

x[[length(x) +1]] <- y

..o simplemente x <- append(x, y) para los vectores.

Aquí está:

`%+=%` <- function(x, y) { xcall <- substitute(x) xobjname <- setdiff(all.names(xcall), c("[[", "[", ":", "$")) # if the object doesn''t exist, create it if (!exists(xobjname, parent.frame(), mode = "list") && !exists(xobjname, parent.frame(), mode = "numeric") && !exists(xobjname, parent.frame(), mode = "character")) { xobj <- subset(y, FALSE) } else { xobj <- eval(xcall, envir = parent.frame()) } if (is.atomic(xobj)) { if (!is.atomic(y)) { stop(''Cannot append object of mode '', dQuote(mode(y)), '' to atomic structure '', xobjname) } assign(xobjname, append(xobj, y), envir = parent.frame()) return(invisible()) } if (is.list(xobj)) { if (is.atomic(y)) { xobj[[length(xobj) + 1]] <- y } else { for (i in seq_along(y)) { xobj[[length(xobj) + 1]] <- y[[i]] names(xobj)[length(xobj)] <- names(y[i]) } } assign(xobjname, xobj, envir = parent.frame()) return(invisible()) } stop("Can''t append to an object of mode ", mode(eval(xcall, envir = parent.frame()))) }

Funciona según lo previsto con el vector o las listas, pero el límite en su forma actual es que no puedo agregar un valor a un elemento dentro de una lista, por ejemplo:

a <- list(a = 1, b = 2) a$b %+=% 3

Hasta ahora no he encontrado cómo hacerlo. He intentado algo como lo siguiente, pero no tiene ningún efecto:

assign("b", append(a$b, 3), envir = as.environment(a))

¿Algunas ideas?


Sugiera no usar asignar y en su lugar:

`%+=%`<- function(x, value) eval.parent(substitute(x <- append(x, value))) x <- 3 x %+=% 5 x ## [1] 3 5 L <- list(a = 1, b = 2) L %+=% 3 ## List of 3 ## $ a: num 1 ## $ b: num 2 ## $ : num 3 L <- list(a = 1, b = 2) L$a %+=% 4 str(L) ## List of 2 ## $ a: num [1:2] 1 4 ## $ b: num 2

o try + <- sintaxis que evita la eval :

`+<-` <- append # test x <- 3 +x <- 1 x ## [1] 3 1 # test L<- list(a = 1, b = 2) +L <- 10 str(L) ## List of 3 ## $ a: num 1 ## $ b: num 2 ## $ : num 10 # test L <- list(a = 1, b = 2) +L$a <- 10 str(L) ## List of 2 ## $ a: num [1:2] 1 10 ## $ b: num 2

O pruebe esta sintaxis de función de reemplazo que es similar a +<- .

`append<-` <- append x <- 3 append(x) <- 7 ## [1] 3 7 ... etc ...