如何让 R 函数对数据帧产生全局影响?

How to get an R function to have a global effect on a dataframe?

我一直在尝试创建一个函数,该函数将永久更改数据框中特定单元格中的值。我插入数据框名称、我希望更改的行索引以及作为字符串的新名称。但是,该函数似乎在局部环境中更改值名称,而不是全局。

函数如下:

#change name function
name_change <- function(df, row, name) {
  df[row, 1] = name
  return(df[row, 1])
}

例如如果数据框是:

Name Column B
Mark 2
Beth 4

函数 name_change(df, 2, 'Jess') 会将 Beth 更改为 Jess。

当作为原始代码插入时,它会永久更改值。但是当用作函数时则不起作用。

df[2, 1] = 'Jess'

提前感谢您的宝贵时间

如果您像这样更改函数:

name_change <- function(df, row, name) {
  df[row, 1] = name
  return(df)
}

然后将函数的结果赋值回原来的df,就会得到你要找的变化:

df = name_change(df,2,'Jess')

您正在 return 计算单元格的值,而不是变异的 df。 R 按值传递参数,因此您可以想象函数修改传入的 df 的副本。解决方案是 return 变异的 df 并重新分配它。

Can you pass-by-reference in R?

已经提供的解决方案的替代方法是使用超赋值运算符<<-。普通赋值 <-(或您使用的“=”)仅在函数的 environment 中运行。超赋值超出了函数的 closure and can thus modify the dataframe residing in the global environment. Note, though, this is a .

也就是说,代码应该是这样的:

#change name function
dirty_name_change <- function(df, row, name) {
  df[row, 1] <<- name ## note the double arrow
}