【发布时间】:2015-08-19 17:18:35
【问题描述】:
我在 R 中有一个很大的函数,用户可以不包含/指定一个对象。如果是,代码会检查以确保该对象中的名称与另一个对象中的名称匹配。如果他们不这样做,则无需进行检查。代码行是:
if(exists("grids")) if(!all(expvarnames %in% names(grids))) {stop("Not all expvar column names found as column names in grids")}
但我收到以下错误:
Error in match(x, table, nomatch = 0L) : argument "grids" is missing, with no default
在这次试运行中,网格应该是缺失的。如果我尝试
if(exists("grids")) print("yay")
然后什么都不会打印,即没有网格意味着表达式没有被评估,正如我所期望的那样。那么谁能想到为什么 R 似乎在评估主要示例中的后续 IF 语句?我应该在第二个括号周围加上另一组大括号吗??
谢谢!
编辑:更多问题。从变量的函数列表中删除“网格”意味着如果没有名为网格的对象并且您没有在调用中指定它(即function(x,grids=whatever)),它会起作用。并且在变量的函数列表中保留“网格”意味着如果有一个名为网格的对象并且您确实在调用中指定了它,它就可以工作。
请看这个:http://i.imgur.com/9mr1Lwi.png
使用 exists(grids) 已被淘汰,因为存在需要“引号”,而没有 em 一切都会失败。有了它们(“网格”),我需要决定是否在函数列表中保留“网格”。如果我不这样做,但我在调用 (function(x,grids=whatever)) 中指定它,那么我会得到未使用的参数失败。如果我这样做了,但由于网格不存在并且我不想使用它而没有在调用中指定它,我会收到匹配错误,网格缺少默认值。
我该如何解决这个问题?也许在函数变量列表中将其列为grids="NULL",而不是if(exists("grids")) 做if(grids!="NULL")
我仍然不知道为什么会发生原始匹配问题。匹配来自 expvarnames/grids 名称检查器,它位于 if(exists("grids")) 之后,其计算结果为 FALSE。 WAaaaaaaaiiiiittttt..... 如果我在函数变量列表中指定网格,即简单地放置function(x,grids,etc){do stuff},这是否意味着函数在其环境中创建了一个名为网格的对象?
伙计,这太f'd了....
testfun <- function(x,grids)
{if(exists("grids")) globalgrids<<-grids
print(x+1)}
testfun(1) # Error in testfun(1) : argument "grids" is missing, with no default
testfun <- function(x,grids)
{if(exists("grids")) a<<-c(1,2,3)
print(x+1)}
testfun(1) #2 (and globally assigns a)
所以在第一个示例中,该函数似乎创建了一个名为“grids”的对象,因为 exists("grids") 的计算结果为 true。但是,在同一条线上,当被要求用网格做某事时,它说它不存在!薛定谔的对象?! 这在示例 2 中得到了证明:grids 评估为 true,并且 a 被全局分配,然后函数执行其操作。疯狂。彻底的疯狂。有谁知道为什么会发生这种荒谬的事情?在函数变量列表中使用我的 grids="NULL" 默认值的最佳解决方案是什么? 谢谢。
可重现的示例,如果您愿意,但我已经为每个排列完成了:
testfun <- function(x,grids)
{if(exists("grids")) if(!all(expvarnames %in% names(grids))) {stop("Not all expvar column names found as column names in grids")}
print(x+1)}
testfun(1)
testfun(x=1,grids=grids)
grids<-data.frame(c(1,2,3),c(1,2,3),c(1,2,3))
expvarnames <- c("a","b","c")
colnames(grids) <- c("a","b","c")
【问题讨论】:
-
您能否提供一个可重现的示例。
argument "grids" is missing, with no default很有趣也很可疑。grids是你函数的参数吗? -
我怀疑“网格”不应该有引号
-
不幸的是,我最初尝试不带引号,但得到:“存在错误(网格):找不到对象'网格'”。这就是我想要的......但是错误破坏了代码! Grids 是我的函数的参数,是的,没有默认值,所以在函数的元素列表中简单地“...,网格,...”。
-
Richard 的评论让我想到:grids 是我的函数中的一个参数,但它是可选的,所以可能不应该指定(就像“...”可选函数中的任何内容一样)。我把它注释掉了,它起作用了。万岁,为大家加油。
-
查看更新的问题。问题半解决,但在 R 中揭示了超级奇怪的不合逻辑
标签: r if-statement nested match