如何在 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 我希望它利用我在参数中写的内容作为向量名称?

【问题讨论】:

您正在使用全局赋值运算符&lt;&lt;-。看看这里的赋值运算符:stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html 您的预期目标是functional programming 的对立面。最好遵守函数式编程的原则(例如,函数不应该有副作用),因为 R 在设计时就考虑到了这些。忘记&lt;&lt;- 运算符吧。 忘记“Google 解决方案”,只需阅读 CRAN 提供的 R-intro 文档> 【参考方案1】:

您可以为此使用函数的返回语句:

num = 5
func = function(x) 
    return(x)

num = func(8)
num
# [1] 8

另请参阅this tutorial I wrote,这提供了有关功能、范围等方面的更深入信息。

还请注意,通常不需要&lt;&lt;- 运算符,因为这会导致代码难以理解。参见例如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()&lt;&lt;-

我们可以使用超赋值运算符通过动态评估来分配给动态名称。

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 中从参数中获取其名称的函数中创建变量?的主要内容,如果未能解决你的问题,请参考以下文章

循环在图表控件中创建多个系列

如何在 PyCharm 中创建模块并将其导入?

视图中的 PHP MVC 循环

如何在 Spring Boot 中从泛型参数(与任何类无关)中获取值

在 R 中创建数据框

如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值