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)
关于为什么会发生这种情况的任何指示都很有用。我觉得答案很明显,但一直无法弄明白。
答案 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()
将返回零长度字符向量。