使用带有替换函数的 get() [英] Using get() with replacement functions

查看:12
本文介绍了使用带有替换函数的 get()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能向我解释为什么会出现下面的例子?

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

#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() 中不能以这种方式工作?

I'd A) like to know why the replacement functions won't work in this way with get()?

b) 考虑到我在下面概述的问题,是否有办法解决此问题;

And b) if there is some way to work around this, given my problem which I outline below;

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

My problem is that I have many objects, created (using a toy example) in a loop, something like this: assign( paste( "Object" , i , sep = "." ) , rnorm(1000 , i) ), where i is a vector, say i <- 1:1000 and then I would like to be able to assign names (for instance from a different vector) to each object in the loop, but names( get( paste( "Object" , i , sep = "." ) ) <- someNewName doesn't work as in the example above.

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

But get( paste( "Object" , i , sep = "." ) ) does return the names (or NULL) of those objects.

谢谢!

推荐答案

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

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)

所以你的例子变成了

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

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

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

这篇关于使用带有替换函数的 get()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆