带有函数参数的意外R行为

时间:2014-06-12 12:38:37

标签: r function parameters

Am R newb。我编写了一个使用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

奇怪的是,当&#34; id&#34;最初没有传递给函数(或默认设置为1:100),代码似乎无论如何都会读取所有文件名。即使是&#34; id&#34;的价值也是如此。从未建立过。

当用户省略将值传递给&#34; id&#34时,就好像R以某种方式处理相同的两个函数。执行函数时...例如,functionx(&#34; var1&#34;,&#34; var2&#34;)##并且不传递任何id变量

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

关于为什么会发生这种情况的任何指示都很有用。我觉得答案很明显,但一直无法弄明白。

1 个答案:

答案 0 :(得分:4)

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

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()将返回零长度字符向量。