使用GET()的替代函数(Using get() with replacement function

2019-07-18 13:39发布

为什么下面的示例中出现任何人都可以向我解释?

#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的对象)。

谢谢!

Answer 1:

要理解为什么这不工作,你需要了解什么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


Answer 2:

使用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))

然后,您可以访问,例如,第一对象为objects[[1]]并有与清单的工作几个功能。



文章来源: Using get() with replacement functions