【问题标题】:Passing arguments to nested functions with ellipses in R language在 R 语言中使用省略号将参数传递给嵌套函数
【发布时间】:2017-03-02 12:54:08
【问题描述】:

按照一个教程(用我的母语),我正在尝试编写一个函数 decorate_string ,它将能够做到这一点:

decorate_string(pattern = "123", "abc")            # "123abc321"
decorate_string(pattern = "123", "abc", "def")     # "123abc def321"
decorate_string(pattern = "123", c("abc", "def"))  # "123abc321" "123def321"
decorate_string(pattern = "123", "abc", "def", sep = "+")    # "123abc+def321"
decorate_string(pattern = "!", c("x", "x"), collapse = "_")  # "!x_x!"
decorate_string(pattern = ".:", 1:2, 3:4, 5:6, sep = "&")    # ".:1&3&5:." ".:2&4&6:." (вектор длины 2)

简而言之:它用分隔符折叠字符串,并用左边的模式和右边的反转模式来分隔它。

我已经这样做了:

decorate_string <- function(pattern, ...) { 
  fock <- function(x, pattern, rev_pat){
    x <- paste(pattern, x, rev_pat, collapse = "")
    return(x)
  }
  rev_pat <- paste(rev((strsplit(pattern,NULL))[[1]]), collapse = "")
  #a <- paste0(..., sep=" ")
  a <- sapply(paste(..., sep=" "), fock)
  return(a)
}

但它告诉我,sep 的论点对应于严格的论点。我猜,它也尝试在嵌套函数中传递 sep 参数,对吧?但是嵌套函数不要求这个参数!我不希望 fock 函数接收我的参数。我只想sapply 收到这个参数!!我该怎么办?谢谢

【问题讨论】:

  • 在函数中添加 sep 作为参数。这样它就不会包含在点列表中。
  • @Dason 对不起,那是我的错!我不希望嵌套函数接收这个参数!我希望sepsapply 中使用一次!
  • 不,问题是如果你没有 sep 作为参数,那么它会被传递到点列表中。因此,当您使用 paste(..., sep = " ") 时,就像您在说 paste(something, sep =",", sep=" ") 一样,所以您会收到错误,因为 R 就像“挂断您不能尝试使用 sep 参数两次”。但是,如果您将其定义为原始函数中的参数,那么它将不会包含在点列表中。
  • 我要补充一点,我真的没有深入了解你在做什么,但这似乎是你遇到的问题。
  • @Dason 先生,你确定吗,你明白,我不希望 sep 进入 fock 函数。但是如果我在fock 中初始化sep,这将使sep 的值能够改变!

标签: r


【解决方案1】:

正如@Dason 建议的那样:" 我从来没有说过任何关于 fock 功能的事情。那不是问题所在。问题出在您的a &lt;- sapply(paste(..., sep=" "), fock) 行中。在该粘贴语句中,通过点传递了一个 sep,然后指定了另一个 sep。您要么需要手动从 dotlist 中删除 sep,要么将其作为传入的不同参数,在这种情况下,它将永远不会在 dotlist 中以开头"

【讨论】:

    【解决方案2】:

    我不确定问题的作者是否正确理解了操作员的工作(...)

    decorate_string <- function(pattern, ...) {
       paste0(pattern, paste(...), stringi::stri_reverse(pattern))}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 2018-06-21
      • 2020-12-19
      • 2013-04-25
      • 1970-01-01
      • 2019-09-10
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多