为什么 rbind 不能在用户定义的函数中工作?
Why is rbind not working inside a user defined function?
我正在尝试将行附加到用户定义函数内的数据框。我以前在一个for循环中毫不费力地做到了这一点,如下:
t1 <- data.frame(a=character(),
b=numeric())
for(i in 1:2){
tmp.df <- data.frame(a="apple", b=i)
t1 <- rbind(t1,tmp.df)
}
我得到一个包含两个观察值的数据框。
但是当我尝试在一个函数中做类似的事情时,它不起作用。我已经尝试调试该函数,但在 rbind 步骤中,它似乎只是在不执行该步骤的情况下退出该函数。所以下面的代码以原始的空数据框结束。
t1 <- data.frame(a=character(),
b=numeric())
create.rows <- function(id, it){
if(it==1){
tmp.df <- data.frame(a=id, b=it)
t1 <- rbind(t1,tmp.df)
}else{
tmp.df <- data.frame(a=id, b=99)
t1 <- rbind(t1,tmp.df)
}
}
为什么会发生这种情况,我该如何解决?
请注意,我事先不知道数据框中会有多少行,因此我无法直接写入特定行。
在一个函数中,需要指定 <<-
形式的赋值运算符,让 R 搜索父环境以找到赋值运算符左侧的对象并为其赋新值。
t1 <- data.frame(a=character(),
b=numeric())
create.rows <- function(id, it){
if(it==1){
tmp.df <- data.frame(a=id, b=it)
t1 <<- rbind(t1,tmp.df)
}else{
tmp.df <- data.frame(a=id, b=99)
t1 <<- rbind(t1,tmp.df)
}
}
create.rows(1,1)
create.rows(1,2)
t1
...输出:
> t1
a b
1 1 1
2 1 99
有关三种赋值运算符(=
、<-
和 <<-
)行为的更多详细信息,请查看 assignment operator 的帮助页面,其中相关部分说:
The operators <<- and ->> are normally only used in functions, and cause a search to be made through parent environments for an existing definition of the variable being assigned. If such a variable is found (and its binding is not locked) then its value is redefined, otherwise assignment takes place in the global environment.
return
函数末尾更改的数据帧。
t1 <- data.frame(a=character(),
b=numeric())
create.rows <- function(id, it){
if(it==1){
tmp.df <- data.frame(a=id, b=it)
t1 <- rbind(t1,tmp.df)
}else{
tmp.df <- data.frame(a=id, b=99)
t1 <- rbind(t1,tmp.df)
}
return(t1)
}
t1 <- create.rows(1,1)
t1
# a b
#1 1 1
我正在尝试将行附加到用户定义函数内的数据框。我以前在一个for循环中毫不费力地做到了这一点,如下:
t1 <- data.frame(a=character(),
b=numeric())
for(i in 1:2){
tmp.df <- data.frame(a="apple", b=i)
t1 <- rbind(t1,tmp.df)
}
我得到一个包含两个观察值的数据框。
但是当我尝试在一个函数中做类似的事情时,它不起作用。我已经尝试调试该函数,但在 rbind 步骤中,它似乎只是在不执行该步骤的情况下退出该函数。所以下面的代码以原始的空数据框结束。
t1 <- data.frame(a=character(),
b=numeric())
create.rows <- function(id, it){
if(it==1){
tmp.df <- data.frame(a=id, b=it)
t1 <- rbind(t1,tmp.df)
}else{
tmp.df <- data.frame(a=id, b=99)
t1 <- rbind(t1,tmp.df)
}
}
为什么会发生这种情况,我该如何解决?
请注意,我事先不知道数据框中会有多少行,因此我无法直接写入特定行。
在一个函数中,需要指定 <<-
形式的赋值运算符,让 R 搜索父环境以找到赋值运算符左侧的对象并为其赋新值。
t1 <- data.frame(a=character(),
b=numeric())
create.rows <- function(id, it){
if(it==1){
tmp.df <- data.frame(a=id, b=it)
t1 <<- rbind(t1,tmp.df)
}else{
tmp.df <- data.frame(a=id, b=99)
t1 <<- rbind(t1,tmp.df)
}
}
create.rows(1,1)
create.rows(1,2)
t1
...输出:
> t1
a b
1 1 1
2 1 99
有关三种赋值运算符(=
、<-
和 <<-
)行为的更多详细信息,请查看 assignment operator 的帮助页面,其中相关部分说:
The operators <<- and ->> are normally only used in functions, and cause a search to be made through parent environments for an existing definition of the variable being assigned. If such a variable is found (and its binding is not locked) then its value is redefined, otherwise assignment takes place in the global environment.
return
函数末尾更改的数据帧。
t1 <- data.frame(a=character(),
b=numeric())
create.rows <- function(id, it){
if(it==1){
tmp.df <- data.frame(a=id, b=it)
t1 <- rbind(t1,tmp.df)
}else{
tmp.df <- data.frame(a=id, b=99)
t1 <- rbind(t1,tmp.df)
}
return(t1)
}
t1 <- create.rows(1,1)
t1
# a b
#1 1 1