如何在R中将NULL作为参数传递?

4

我有一个向量arguments,其中一些值为NA。我想按顺序将这些参数传递给以下函数:

myFunction(argument = ifelse(!is.na(arguments[i]),
           arguments[i], NULL))

这样做可以使它在arguments[i]不是NA时取值,否则取默认值NULL。但这会产生一个错误。

如果有任何区别,被问到的函数是optmatch包中的match_on()函数。被问到的参数是caliper,因为我想在只有一个可用的卡尺时提供一个卡尺(即当卡尺向量中的值不是NA时)。错误信息如下:

Error in ans[!test & ok] <- rep(no,  length.out = length(ans))[!test &  : 
replacement has length zero
In addition: Warning message:
In rep(no, length.out = length(ans)) :'x' is NULL so the result will be NULL 

为什么你不能在函数内部收到参数后进行NA检查呢? - Vivek Kalyanarangan
2
NULL和NA是两个非常不同的东西。NULL是一种对象。另外,检查某个东西是否为NA的方法是使用!is.na(arguments)。此外,ifelse()是矢量化的,所以我不确定为什么要使用索引..是否在循环中使用ifelse?您需要提供更多上下文。但是,在R中将NA更改为NULL并没有什么意义。 - Elin
使用if和else。 - Roland
@Roland,那绝对是一个有效的答案,但是...有没有办法在函数调用中像我尝试的那样做呢? - suckrates
参数 = 如果 ... 否则 ... - Roland
显示剩余2条评论
1个回答

4
您可以使用?switch()代替ifelse-
myFunction(argument = switch(is.na(arguments[i]) + 1, arguments[i], NULL))

以下是关于 switch 的帮助文档:

switch(EXPR, ...)

参数

EXPR 一个求值为数字或字符字符串的表达式。

... 替代选项列表。如果打算让 EXPR 具有字符字符串值,则这些将被命名,可能除了一个替代选项用作“默认”值。

详细信息

switch 有两种不同的工作方式,具体取决于第一个参数求值为字符字符串还是数字。

如果 EXPR 的值不是字符字符串,则强制转换为整数。如果整数在 1 和 nargs()-1 之间,则计算相应的 ... 元素并返回结果:因此,如果第一个参数是 3,则计算并返回第四个参数。

基本上,当参数为 NA 时,EXPR 求值为 2,返回 NULL;否则,EXPR 求值为 1 并返回 arguments[i]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接