13

谁能向我解释为什么会出现以下示例?

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

#Return the dataframe from the given character vector
get( "df" ) 
            P          Q          R
1  0.17396222 0.90994676 0.90590685
2  0.33860092 0.98078739 0.38058921
3  0.80751402 0.93229290 0.82853094
4  0.05460417 0.55448507 0.01605027
5  0.04250316 0.03808318 0.40678270

#Return the column names of df
colnames( get( "df" ) )
[1] "P" "Q" "R"

#But using a replacement function...
colnames( get( "df" ) ) <- c( "S" , "T" , "U" ) 
    Error in colnames(get("df")) <- c("S", "T", "U") : 
    target of assignment expands to non-language object

我想 A)想知道为什么替换功能不能以这种方式工作get()

b)如果有一些方法可以解决这个问题,考虑到我在下面概述的问题;

我的问题是我有很多对象,在循环中创建(使用玩具示例),如下所示:assign( paste( "Object" , i , sep = "." ) , rnorm(1000 , i) )i向量在哪里,说i <- 1:1000然后我希望能够分配名称(例如从不同的向量)到循环中的每个对象,但names( get( paste( "Object" , i , sep = "." ) ) <- someNewName不像上面的例子那样工作。

get( paste( "Object" , i , sep = "." ) )确实返回NULL这些对象的名称(或)。

谢谢!

4

2 回答 2

19

要了解为什么这不起作用,您需要了解什么起作用colnames<-。就像其中的每个函数看起来都在修改一个对象,它实际上是在修改一个副本,所以在概念上colnames(x) <- y被扩展为:

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

如果您以通常的方式调用替换运算符,则可以写得更紧凑:

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

所以你的例子变成

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

右侧是有效的 R,但整个命令不是,因为您不能为函数的结果赋值:

x <- 1
get("x") <- 2
# Error in get("x") <- 2 : 
#  target of assignment expands to non-language object
于 2013-01-22T19:16:59.440 回答
10

以您在问题中演示的方式使用assign在 R 中至少是不常见的。通常您只需将所有对象放在一个列表中。

所以,而不是

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

你会做的

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

事实上,这种结构非常常见,以至于有一个(优化的)函数(lapply),它做了类似的事情:

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

然后,您可以访问,例如,第一个对象 asobjects[[1]]并且有几个用于处理列表的函数。

于 2013-01-22T17:45:57.743 回答