以文本形式提供功能参数

时间:2019-01-23 12:35:21

标签: r function

对于循环,我需要一些算法,该算法将迭代地提供从字符串到函数的参数列表。

最小示例如下:

my_func <- function(x, a=0, b=0){
            print(x)
            if(a == 0){
              return('a is zero')
              } else {
                print(paste0(a, ' and ', b))
                }
}

它应该像这样工作:

abc(10, a=5, b=3)
[1] 10
[1] "5 and 3"

但是,我找不到一种方法可以正常使用所有参数abc(10, paste0('a=5, b=3'))的字符串输入,该方法将该字符串作为第一个参数的输入:

[1] 10
[1] "a=5, b=3 and 0"

如果还有其他一些选项可以向函数提供参数列表(而不是字符串形式),那么欢迎您!

2 个答案:

答案 0 :(得分:0)

这里是尝试:您可以使用基本的正则表达式功能。

  my_func1<-function(x, string){

  a<-as.numeric(sapply(stringr::str_extract_all(string,"\\d"),"[")[1])
  b<-as.numeric(sapply(stringr::str_extract_all(string,"\\d"),"[")[2])

  print(x)
  if(a == 0){
    return('a is zero')
  } else {
   print(paste0(a," and ", b))
  }
}

my_func1(x=10,"a=5,b=5")
#[1] 10
#[1] "5 and 5"

答案 1 :(得分:0)

您可以使用purrr::invoke_map,它采用了函数列表和函数参数列表的组合。在这种情况下,您只需要一个函数,但是可以使用参数列表xab的列表。

在函数中注意:您有3条语句用于创建一些输出。其中两个是print调用,一个是return。我将return更改为print,以为可能是一个错误,但是如果不是这种情况,请随时忽略。

使用一组伪参数,我正在调用invoke_map并将其保存到变量out中,该变量的长度与输入列表的长度相同。我之所以保存它,是因为否则您的内容将打印两次:一次在调用函数中的print时返回,最后一行返回。

library(purrr)

my_func <- function(x, a=0, b=0){
  print(x)
  if(a == 0){
    # return('a is zero')
    print("a is zero")
  } else {
    print(paste0(a, ' and ', b))
  }
}

params <- list(
  list(x = 10, a = 5, b = 2),
  list(x = 3, a = 11, b = 1),
  list(x = 5, a = 0, b = 9)
)

out <- invoke_map(my_func, params)
#> [1] 10
#> [1] "5 and 2"
#> [1] 3
#> [1] "11 and 1"
#> [1] 5
#> [1] "a is zero"

reprex package(v0.2.1)于2019-01-23创建