稍微尴尬地问这么简单的问题,但我现在浪费了一个小时,并计算出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
提前致谢。
答案 0 :(得分:5)
好的解决了。谢谢@Andrie,抱歉我误解了你的回复。
新秀错误:(
f <- function(x) {
x[1,] <- c(1,2,3)
return(x)
}
m <- f(m)
m
答案 1 :(得分:3)
您无需提供名称作为额外参数; substitute
会为您提供。要在调用函数的范围内执行操作,请将eval
与parent.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列表。请记住,如果需要,列表的每个成员都可以使用不同的数据类型。