Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将get()与替换函数一起使用_R_Function_Syntax_Base_Replace - Fatal编程技术网

R 将get()与替换函数一起使用

R 将get()与替换函数一起使用,r,function,syntax,base,replace,R,Function,Syntax,Base,Replace,有人能给我解释一下为什么会出现下面的例子吗 #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

有人能给我解释一下为什么会出现下面的例子吗

#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
#创建简单数据帧
赋值(“df”,data.frame(P=runif(5),Q=runif(5),R=runif(5)))
#从给定的字符向量返回数据帧
获取(“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
#返回df的列名
colnames(get(“df”))
[1] “P”“Q”“R”
#但是使用替换函数。。。

colnames(get(“df”)以您在问题中演示的方式使用
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) }

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

要理解为什么这不起作用,您需要了解什么是
colnames对于您的特定问题,请尝试
设置名称。总的来说,我不知道为什么它不起作用:我期待着阅读一个启发性的答案。不要使用
assign
。将在循环中创建的所有对象放入列表中。很有可能你甚至不需要
for
循环。我知道我可能不需要
for
循环,这纯粹是方便。老实说,调用循环来创建对象的开销是最小的,<0.1秒,因此在这种情况下,我并没有严格地决定对所有内容进行矢量化。这是一个有用的方便构造,为懒惰的编码者提供了位置(加上我在不同对象的循环中做了一些其他重命名赋值,所以它真的很方便)。:挥手:求值,等等,:更多挥手:试试
colnames@SimonO101我把你的观点转到罗兰身上,但在我看来,使用
assign
get
必须有一个真正令人信服的理由,而不是使用
lappy
和使用列表的更像R的范例。我很想理解你为什么要避免使用列表。几乎是+1,如果你也添加
lappy
版本,我会向上投票。+1
lappy()
就是这个方法。它将简化代码,甚至可能比for循环更快,这仅仅是因为
@Andrie
@hadley抱歉,您的代码是正确的。我本应该写
[@Andrie如果你想更准确的话,它真的是
[非常感谢你对我的问题做出了清晰而简洁的解释。这正是我所希望的。@SimonO101稍微调整了一下以使其更准确。在(搜索“替换函数”)中有更多细节谢谢哈德利-我现在要去devtools了!
objects <- lapply(1:10, function(x) rnorm(1000,x))
copy <- x
colnames(copy) <- y
x <- copy
x <- `colnames<-`(x, y)
get("x") <- `colnames<-`(get("x"), y)
x <- 1
get("x") <- 2
# Error in get("x") <- 2 : 
#  target of assignment expands to non-language object