首页 > 解决方案 > 为什么 rbind 在用户定义的函数中不起作用?

问题描述

我正在尝试将行附加到用户定义函数内的数据框。我之前在 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)
  }
}

为什么会发生这种情况,我能做些什么来解决它?

请注意,我事先不知道数据框中将有多少行,因此我无法直接写入特定行。

标签: rfunctionrbind

解决方案


在函数中,需要指定<<-赋值运算符的形式,以使 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

有关赋值运算符 ( 和 ) 的三种形式的行为的更多详细信息=<-<<-查看赋值运算符的帮助页面,其中相关部​​分显示:

运算符 <<- 和 ->> 通常只在函数中使用,并导致通过父环境搜索被分配变量的现有定义。如果找到这样的变量(并且其绑定未锁定),则重新定义其值,否则在全局环境中进行赋值。


推荐阅读