Using get() with replacement functions

前端 未结 2 886
野的像风
野的像风 2020-11-29 12:04

Can anyone explain to me why the following example occurs?

#Create simple dataframe
assign( \"df\" , data.frame( P = runif(5) , Q = runif(5) , R = runif(5) )         


        
相关标签:
2条回答
  • 2020-11-29 12:46

    Using assign in the way you demonstrate in the question is at least uncommon in R. Normally you would just put all objects in a list.

    So, instead of

    for (i in 1:10) {
    assign( paste( "Object" , i , sep = "." ) , rnorm(1000 , i) )}
    

    you would do

    objects <- list()
    for (i in 1:10) {
    objects[[i]] <- rnorm(1000 , i) }
    

    In fact, this construct is so common that there is a (optimized) function (lapply), which does something similar:

    objects <- lapply(1:10, function(x) rnorm(1000,x))
    

    You can then access, e.g., the first object as objects[[1]] and there are several functions for working with lists.

    0 讨论(0)
  • 2020-11-29 12:53

    To understand why this doesn't work, you need to understand what colnames<- does. Like every function in that looks like it's modifying an object, it's actually modifying a copy, so conceptually colnames(x) <- y gets expanded to:

    copy <- x
    colnames(copy) <- y
    x <- copy
    

    which can be written a little more compactly if you call the replacement operator in the usual way:

    x <- `colnames<-`(x, y)
    

    So your example becomes

    get("x") <- `colnames<-`(get("x"), y)
    

    The right side is valid R, but the command as a whole is not, because you can't assign something to the result of a function:

    x <- 1
    get("x") <- 2
    # Error in get("x") <- 2 : 
    #  target of assignment expands to non-language object
    
    0 讨论(0)
提交回复
热议问题