0

问这么简单的问题有点尴尬,但我现在浪费了一个小时,想出了一个 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

提前致谢。

4

3 回答 3

5

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

菜鸟错误:(

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

m <- f(m)
m
于 2012-08-27T11:22:36.997 回答
3

You don't need to provide the name as an extra argument; substitute will get that for you. To do things in the scope of the calling function you use eval with parent.frame.

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

Then,

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

That said, modifying the caller's environment is generally a bad idea and it will usually lead to less confusing/fragile code if you just return the value and re-assign it to m instead. This is generally preferable.:

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

m <- f(m)

However, I have occasionally found eval shenanigans to come in handy when I really needed to change an array in place and avoid an array copy.

于 2012-08-27T11:34:15.500 回答
2

我可能错过了您为什么要这样做的重点,但是我认为这完全可以满足您的要求:

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

m 的值在全局环境中发生了变化。

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

于 2012-08-27T11:38:19.443 回答