如何用点(...)参数覆盖硬编码的函数参数?

时间:2019-05-30 09:34:07

标签: r

我正在尝试使绘图函数具有一组默认值,并通过使用 foreach (var item in result)) { MessageBox.Show($"{item.date} and {item.id}"); } 函数在点(plot)参数内部接受的任何参数来灵活地更改这些值。一个例子:

...

错误自然是因为我试图两次将asp参数传递到PlotIt <- function(x, y, ...) { plot(x, y, type = "l", asp = 1, ...) } x <- 1:10 y <- 10:1 PlotIt(x = x, y = y) # Returns a plot PlotIt(x = x, y = y, asp = NA) # Error in plot.default(x, y, type = "l", asp = 1, ...) : # formal argument "asp" matched by multiple actual arguments 中。到目前为止,我最笨拙的尝试是做出一个if-else语句来考虑到这一点(方法是从here修改而来):

plot

要对可以使用PlotIt2 <- function(x, y, ...) { mc <- match.call(expand.dots = FALSE) if(names(mc$...) %in% "asp") { plot(x, y, type = "l", ...) } else { plot(x, y, type = "l", asp = 1, ...) } } PlotIt2(x = x, y = y, asp = NA) # works 参数设置的所有可能参数执行此操作,我需要编写一个长的if-else语句。 是否有更优雅的方法?

问题与this one有关,不同之处在于我想自动覆盖...参数设置的所有参数。

1 个答案:

答案 0 :(得分:1)

如果您只想使用基数R, 您可以将所有内容放在列表中,并根据参数名称删除重复项 (确保默认设置为最后设置,以便在@SerializedName("status") @Expose private String status; @SerializedName("totalResults") @Expose private Integer totalResults; @SerializedName("articles") @Expose private List<Article> articles = null; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public Integer getTotalResults() { return totalResults; } public void setTotalResults(Integer totalResults) { this.totalResults = totalResults; } public List<Article> getArticles() { return articles; } public void setArticles(List<Article> articles) { this.articles = articles; } } 中包含默认设置时将其删除):

...

如果您不介意依靠rlang, 您还可以执行以下操作, 使用PlotIt <- function(x, y, ...) { arguments <- list( x = x, y = y, ..., type = "l", asp = 1 ) arguments <- arguments[!duplicated(names(arguments))] do.call("plot", arguments) } 获得相同的功能 (并检查坐标轴的图标签, 基本R版本和.homonyms版本之间会有所不同):

rlang