对于循环,我需要一些算法,该算法将迭代地提供从字符串到函数的参数列表。
最小示例如下:
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"
如果还有其他一些选项可以向函数提供参数列表(而不是字符串形式),那么欢迎您!
答案 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
,它采用了函数列表和函数参数列表的组合。在这种情况下,您只需要一个函数,但是可以使用参数列表x
,a
和b
的列表。
在函数中注意:您有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创建