如何在 R 中从参数中获取其名称的函数中创建变量?
Posted
技术标签:
【中文标题】如何在 R 中从参数中获取其名称的函数中创建变量?【英文标题】:How to create a variable within a function that takes its name from an argument, within R? 【发布时间】:2016-09-16 04:40:35 【问题描述】:我完全是 R 的初学者,并且一直在努力搜索我的问题的解决方案,因为虽然我确信这是一个非常基本的问题,但我发现很难解释我想要做什么。我很欣赏 *** 仅适用于严肃的程序员,所以如果有人甚至可以指出其他人处理同一主题的问题,我将非常感激。话虽如此:
我想做的是有一个函数能够读取并分配给向量的名称,而不仅仅是它的内容。我写的时候:
num <- 5
func <- function(x)
x <<- 8
func(num)
我认为它会创建一个名为“num”的新向量。 -- 就像这样,它会读起来像:
func(num)
num <<- 8.
但是相反,它要么只是创建一个字面上称为“x”的新向量,并将“8”分配给它,要么它试图将“8”分配给“5”,我真的不知道是哪个。无论哪种方式,我如何告诉 R 我希望它利用我在参数中写的内容作为向量名称?
【问题讨论】:
您正在使用全局赋值运算符<<-
。看看这里的赋值运算符:stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html
您的预期目标是functional programming 的对立面。最好遵守函数式编程的原则(例如,函数不应该有副作用),因为 R 在设计时就考虑到了这些。忘记<<-
运算符吧。
忘记“Google 解决方案”,只需阅读 CRAN 提供的 R-intro 文档>
【参考方案1】:
您可以为此使用函数的返回语句:
num = 5
func = function(x)
return(x)
num = func(8)
num
# [1] 8
另请参阅this tutorial I wrote,这提供了有关功能、范围等方面的更深入信息。
还请注意,通常不需要<<-
运算符,因为这会导致代码难以理解。参见例如this SO post。
【讨论】:
谢谢,会阅读!我有使用 【参考方案2】:在我提供解决方案之前,我认为最好先解决一个关于参数传递的误解。当你调用一个函数时
func(num)
您没有将变量的 name 作为参数值传递,而是将变量的 value 作为参数值传递。换句话说,如果num
等于 5,那么您传递的是数字 5。如果函数使用标准参数评估,那么它将不知道参数中使用的变量名称,或者即使存在根本不是一个变量名(如果参数值是从文字或表达式产生的,则可能没有)。
如果要将变量名作为参数值传递,则需要引用:
func('num')
话虽如此,有一种叫做非标准参数评估的东西。 R 相当不寻常,因为它提供了一种机制来检索绑定到参数的参数表达式,这实际上可以让您从函数内部检索变量名称。 substitute()
函数经常用于此目的。用作参数表达式的变量名甚至不必与现有变量相对应即可。
f <- function(x) as.character(substitute(x));
f(some.var);
## [1] "some.var"
许多基本 R 函数使用非标准参数评估,例如 rm()
和 library()
。
有几种方法可以做你想做的事。
1: assign()
assign()
函数可用于在任何环境中分配参数化变量名称。您分配的目标似乎是全局环境,有时称为工作空间环境,可以通过globalenv()
(或.GlobalEnv
)访问。
f <- function(x) assign(x,8,envir=globalenv());
num;
## Error: object 'num' not found
f('num');
num;
## [1] 8
2:环境访问
可以取消引用环境对象并直接分配它,但奇怪的是,返回环境对象的函数调用或表达式似乎不能以这种方式用作左值。换句话说,您需要先在变量中捕获环境对象,然后才能取消引用和分配它。
f <- function(x) e <- globalenv(); e[[x]] <- 9; ;
num;
## Error: object 'num' not found
f('num');
num;
## [1] 9
globalenv()$num <- 'why doesn\'t this work???';
## Error in globalenv()$num <- "why doesn't this work???" :
## invalid (NULL) left side of assignment
3: parse()
、eval()
和 <<-
我们可以使用超赋值运算符通过动态评估来分配给动态名称。
f <- function(x) eval(parse(text=paste0(x,' <<- 10;')));
num;
## Error: object 'num' not found
f('num');
num;
## [1] 10
上述任何方法都可以与非标准参数评估相结合,例如:
f <- function(x) assign(as.character(substitute(x)),11,envir=globalenv());
num;
## Error: object 'num' not found
f(num);
num;
## [1] 11
【讨论】:
以上是关于如何在 R 中从参数中获取其名称的函数中创建变量?的主要内容,如果未能解决你的问题,请参考以下文章