[SOLVED] R replace list elements from within a function

Issue

In R I’d like to replace some elements in a list using the $ notation:

# functions
replaceNonNull <- function(x, value) {
  if(!is.null(x)){
    thisx <- deparse(substitute(x))
    
    print(paste0("replacing ", thisx, " with  '",value,"'"))
    
    #x <<- value
    assign(thisx, value, envir = .GlobalEnv)
  }
}
mylist = list("a"=1:3)
replaceNonNull(mylist$a,"456");mylist$a

However after running replaceNonNull, a new variable is created with name 'mylist$a'. How can I change the a value in the list instead?

Solution

The problem you’re having is that the first argument of assign is:

x – a variable name, given as a character string.

But even outside the function, this doesn’t work.

assign(mylist$a,0)
#Error in assign(mylist$a, 0) : invalid first argument
assign("mylist$a",0)
mylist
#$a
#[1] 1 2 3

However, you can use $<-, like this:

> mylist$a <- 0
> mylist$a
[1] 0

One approach, then is to create that expression and evaluate it:

mylist = list("a"=1:3)
myexpression <- deparse(substitute(mylist$a))
myexpression
#[1] "mylist$a"

library(rlang)
expr(!!parse_expr(myexpression) <- 0)
#mylist$a <- 0
eval(expr(!!parse_expr(myexpression) <- 0))
mylist$a
#[1] 0

Obviously use <<- inside the function.

Answered By – Ian Campbell

Answer Checked By – Robin (BugsFixing Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *