R中函数内的对象重新分配

时间:2012-08-27 11:00:15

标签: r

稍微尴尬地问这么简单的问题,但我现在浪费了一个小时,并计算出30秒的解决方案。问题是如何编辑作为函数输入提供的现有对象。我也玩超级作业<<-但没有成功。

示例函数使用2个输入(一个用于对象,一个用于其名称)。我只需要一个这样的形式,不需要'n'输入。

m <- c(2,5,3,7,1,3,9,3,5)
dim(m) <- c(3,3)
m

f <- function(x, n) { # where 'n' is the object name of 'x'
  x[1,] <- c(1,2,3)
  assign(n, x, envir = .GlobalEnv)
}

f(m, 'm')
m

提前致谢。

3 个答案:

答案 0 :(得分:5)

好的解决了。谢谢@Andrie,抱歉我误解了你的回复。

新秀错误:(

f <- function(x) {
  x[1,] <- c(1,2,3)
  return(x)
}

m <- f(m)
m

答案 1 :(得分:3)

您无需提供名称作为额外参数; substitute会为您提供。要在调用函数的范围内执行操作,请将evalparent.frame一起使用。

f <- function(x) {
  eval(substitute( x[1,] <- c(1,2,3) ), parent.frame())
}

然后,

m <- c(2,5,3,7,1,3,9,3,5)
> dim(m) <- c(3,3)
> m
     [,1] [,2] [,3]
[1,]    2    7    9
[2,]    5    1    3
[3,]    3    3    5
> f(m)
> m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    5    1    3
[3,]    3    3    5

也就是说,修改调用者的环境通常是一个坏主意,如果你只返回值并将其重新分配给m,通常会导致代码混乱/脆弱。这通常是可取的。:

f <- function (x) {
    x[1,] <- c(1,2,3)
    x
}

m <- f(m)

但是,当我真的需要更改数组并避免数组副本时,偶尔会发现eval恶作剧派上用场。

答案 2 :(得分:2)

我可能忽略了你为什么要这样做的重点,但我认为这将完全符合您的要求:

m[1,] = c(1,2,3)

m的值已在全球环境中更改。

我只是在这里猜测,但是通常编写函数来获取对象“名称”的人会发现R列表很有用。如果您发现自己想要根据名称操作变量,请考虑使用R列表。请记住,如果需要,列表的每个成员都可以使用不同的数据类型。