【发布时间】:2013-01-06 00:44:22
【问题描述】:
谁能解释一下为什么会出现下面的例子?
#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)。
谢谢!
【问题讨论】:
-
对于您的具体问题,请尝试
setNames。一般来说,我不知道为什么它不起作用:我期待阅读一个有启发性的答案。 -
不要使用
assign。而是将循环中创建的所有对象放入列表中。很有可能您甚至不需要for循环。 -
我知道我可能不需要
for循环,这只是为了方便。老实说,调用循环来创建对象的开销很小, -
:挥手:评估,等等等等,:更多的挥手:尝试
'colnames<-'(get('df'),c('A','B','C'))和colnames(data.frame( P = runif(5) , Q = runif(5) , R = runif(5) )) <- c('A','B','C') -
@SimonO101 我把你的观点指向 Roland,但在我看来,使用
assign和get而不是更类似于 R 的范式lapply必须有一个非常令人信服的理由并使用列表。我很想知道您为什么要避免使用列表。
标签: r function syntax base replace