Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当R中缺少参数时,如何调用另一个函数以使用其默认参数?_R_Ggplot2_Arguments - Fatal编程技术网

当R中缺少参数时,如何调用另一个函数以使用其默认参数?

当R中缺少参数时,如何调用另一个函数以使用其默认参数?,r,ggplot2,arguments,R,Ggplot2,Arguments,我有一个带有多个可选参数的函数,可以使用ggplot2修改绘图。如果缺少这些参数中的任何一个,我希望在ggplot2中使用它们的默认值。如果只有一个参数,可以这样做: simple_plot <- function (color) { p <- ggplot(mtcars, aes(cyl, mpg)) if(!missing(color)) { p <- p + geom_point(col = color) } else {

我有一个带有多个可选参数的函数,可以使用ggplot2修改绘图。如果缺少这些参数中的任何一个,我希望在ggplot2中使用它们的默认值。如果只有一个参数,可以这样做:

simple_plot <- function (color) {
   p <- ggplot(mtcars, aes(cyl, mpg))

   if(!missing(color))
   {
      p <- p + geom_point(col = color)
   } else {
      p <- p + geom_point()            # use its default if the argument is missing
   }
}

如果您调用一个没有参数的函数,它将使用默认值,因此,如果您真的想在包装器函数中包含一些参数,那么一个选项是将默认值复制为新的默认值

例如,可以使用
formals()
提取函数的默认值

formals(ggplot2::geom_点)
#>$mapping
#>空的
#> 
#>$data
#>空的
#> 
#>$stat
#>[1]“身份”
#> 
#>美元头寸
#>[1]“身份”
#> 
#> $...
#> 
#> 
#>$na.rm
#>[1]错误
#> 
#>$show.legend
#>[1]NA
#> 
#>$inherit.aes
#>[1]是的
注意,
col
不是其中之一
col
通过
传递,因此这更难处理

您可以检索这些默认值,但要循环检查包装中缺少哪些默认值,您需要使用
missing()
,这有其自身的复杂性。。。从
?缺少

当前缺少只能在定义参数的函数的直接体中使用,而不能在嵌套函数或本地调用的体中使用。这在将来可能会改变

这是一个“特殊”基元函数:它不能计算其参数

(我的重点)。您不能将符号传递给
missing()
,它需要字符串,因此您不能执行类似
sapply(args,missing)
的操作,它就是不起作用

不过,如果你不需要评估自己的论点,你可以通过不评估自己的论点来保留缺失。比如说

my_fun geom_point:na.rm=TRUE
#>stat_标识:na.rm=TRUE
#>位置抖动
我的乐趣(position=“jitter”)
#>几何点:na.rm=FALSE
#>stat_标识:na.rm=FALSE
#>位置抖动
我的乐趣(na.rm=TRUE)
#>几何点:na.rm=真
#>stat_标识:na.rm=TRUE
#>位置标识
all.equal(ggplot2::geom_point(),my_fun())
#>[1]是的
如果指定了命名参数(如果确实需要,甚至可以更改其名称),则将使用命名参数,否则将使用默认值。请注意,我没有包装所有的默认值,只是那些我想在我的函数中。您仍然可以将其他参数传递给
,否则采用默认值

ggplot2::ggplot(mtcars,ggplot2::aes(cyl,hp))+my_-fun(position=“jitter”,col=“red”)

由(v0.3.0)于2020年12月28日创建,您可以使用来调用具有参数列表的函数。因此,您所需要做的就是将参数收集到一个列表中,并忽略缺少的参数

只要您的参数与相应的“ggplot2”函数中的参数名称相同,就只需要一个简单的参数:

simple_plot = function (color, shape, fill) {
    args = as.list(match.call())[-1L]
    ggplot(mtcars, aes(cyl, mpg)) + do.call('geom_point', args, envir = parent.frame())
}
对于更复杂的功能(例如参数名称不匹配),您可以在将列表传递给
do.call
之前对其进行操作;您还可以使用构造未计算的调用,并在以后对其进行计算:

the_call = as.call(c(as.name('geom_point'), args))
# … evaluate it:
eval.parent(the_call)

请注意,
args
可能包含未计算的表达式,因此计算需要在调用环境中进行(在上述两种情况下都是这样)。如果您想在函数中注入您自己的本地名称,则需要在添加它们之前对其进行求值,否则将找不到它们。

因此,您希望将命名参数分布到不同的函数中,例如
ggplot
geom\u point
scale\u x\u continuous
等?是的。例如,轴标题的title.x和title.y。如果缺少这些参数中的任何一个,则轴标题将由ggplot2指定,默认情况下,ggplot2是x和y变量的名称。谢谢您的回答。我添加了一些代码来澄清我的问题。像
scale\u y\u continuous(name=title.y1,breaks=breaks.y1,sec.axis=sec\u axis(name=title.y2,breaks=breaks.y2))这样的嵌套函数调用如何?@HiCLH具有嵌套调用实际上不会改变任何事情。在您的代码中,您当然会添加一些对参数列表的处理,因为并非所有参数都被分派到同一个函数中——因此您需要根据列表的名称来拆分列表。但除此之外,同样的方法也有效。
the_call = as.call(c(as.name('geom_point'), args))
# … evaluate it:
eval.parent(the_call)