Параметры функции снабжения в виде текста - PullRequest
0 голосов
/ 23 января 2019

Для цикла мне нужен какой-то алгоритм, который будет итеративно предоставлять список параметров из строки в функцию.

Минимальный пример может быть следующим:

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 голосов
/ 23 января 2019

Вы можете использовать purrr::invoke_map, который принимает комбинацию из списка функций и списка аргументов функции.В этом случае вам нужна только одна функция, но вы можете использовать список списков аргументов x, a и b.

Примечание в вашей функции: у вас есть 3 операторачто касается создания некоторого выхода.Два из них print, а один - return.Я изменил return на print, думая, что это, возможно, было ошибкой, но не стесняйтесь игнорировать, если это не так.

Используя набор фиктивных аргументов, я звоню invoke_mapи сохраняя его в переменной out, которая является списком той же длины, что и список ввода.Я сохранил его только потому, что в противном случае у вас есть вещи, распечатываемые дважды: один раз при вызове print s в функции и один в качестве последней строки возвращается.

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"

Создано в 2019 году-01-23 по представлению пакета (v0.2.1)

0 голосов
/ 23 января 2019

Вот попытка: Вы можете использовать базовые функции регулярных выражений.

  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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...