0

我想在列表中添加一个新成员。当我这样做时。但是当我想在一个函数中做这件事时,什么都没有改变..

> a = list( x=4, y=2)
> a
$x
[1] 4

$y
[1] 2

> a$c = 7
> a
$x
[1] 4

$y
[1] 2

$c
[1] 7

使用函数...

> addNew(a)
> a
$x
[1] 4

$y
[1] 2

功能是:

addNew = function(list){
  list$c = 7
}

也许这有点像c中的指针问题,但如何解决呢?

4

2 回答 2

1

您必须返回并分配修改后的列表:

a <- list(x=4, y=2)
addNew <- function(l) {
  l$c <- 7
  return(l)
}
a <- addNew(a)

编辑:正如@mitra 提到的你可以使用<<-

a <- list(x=4, y=2)
addNew <- function() {
  a$c <<- 7
}

但这改变了 R 中函数的典型行为。大多数用户没想到函数会产生副作用,比如改变全局环境。

请阅读 Patrick Burns 的R Inferno(第 35 页):

如果你认为你需要 <<- ,再想一想。如果经过反思,您仍然认为您需要 <<- ,请再想一想。只有当你的老板因为你什么都不做而气得脸红时,你才应该暂时屈服于诱惑。已经有人提议(不过是半开玩笑)从语言中删除 <<- 。这不会消除全局分配,只会迫使您使用分配功能来实现它们。

于 2013-08-29T07:48:32.167 回答
0

你应该看看局部变量和全局变量之间的区别:

R中的全局变量和局部变量

如果您在函数内部定义变量,它是临时的并且仅属于该函数。

检查这个:

list$c<<-7
于 2013-08-29T07:58:07.767 回答