【问题标题】:Unexpected R behavior with function parameter带有函数参数的意外 R 行为
【发布时间】:2014-06-12 12:38:36
【问题描述】:

Am R 新手。我编写了一个使用 3 个参数的函数。在我的代码中,我使用其中一个参数来帮助我从目录中读取文件。目录中有 100 个文件。当我将所有函数参数传递给它并指定我要读取的文件时,代码工作正常。

functionX(var1, var2, id) and functionX(var1, var2, id = 1:100)

## Below is the first line of code for me that uses "id".

sub.file.names  <- file.names[id]   ### Get file names

奇怪的是,当“id”的值最初没有传递给函数(或设置为 1:100 默认值)时,代码似乎无论如何都读取了所有文件名。即使“id”的值从未建立,它也会这样做。

当用户在执行函数时省略将值传递给“id”时,就好像 R 以某种方式将下面的两个函数视为相同...例如,functionx("var1", "var2") ## 而没有传递任何 id 变量

functionx(var1, var2, id)
functionx(var1, var2, id = 1:100)

任何关于为什么会发生这种情况的指示都会很高兴知道。我觉得答案很明显,但一直无法弄清楚。

【问题讨论】:

  • 可能是if(missing(id)) do something.`
  • 您可能需要提供更多关于您所做工作的详细信息 - 您是否定义了两个版本的 functionX()?如果是这样,第二个将覆盖第一个。

标签: r function parameters


【解决方案1】:

让我试着用一个简单的例子来解释发生了什么。考虑以下函数

foo = function(i){
  LETTERS[i]
}

当您尝试foo() 时,您会注意到该函数返回所有26 个大写字母。为什么会这样?好吧,R 中的一切都是函数。所以当你说LETTERS[i]时,你实际上是在调用函数[。所以,函数调用是

`[`(LETTERS, i)

由于缺少i,此调用以[(LETTERS)(本质上为LETTERS[])执行,它返回向量的所有元素。请注意,这是因为[ 函数允许在调用它时缺少i 参数。检查?[

如果您希望函数在缺少id 时采取不同的行为,请检查missing(id),或将其显式设置为默认值NULL。所以,如果你这样做了

foo2 = function(i = NULL){
  LETTERS[i]
}

foo2() 将返回一个零长度的字符向量。

【讨论】:

  • 该死,打败我 :-)
  • Thx Ramnath - 很好的解释和可靠的例子。如果我想要不同的行为,我也很感激你添加了关于使用 NULL 显式设置的部分。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多