2014-12-03 2 views
1

Я создаю функцию в R, где я прошу письмо (или строку). Вот пример с первой функцией:using character R function

fun.1<-function(a=2,b=3,c=4) return(a+b^2+c^3) 

и другая функция с помощью первого:

fun.2<-function(letter.to.test="a",a=2,b=3,c=4){ 
    if(letter.to.test=="a") {a=0:10} 
    else if(letter.to.test=="b"){b=0:10} 
    else {c=0:10} 
    return(fun.1(a,b,c)) 
} 

Как я могу написать fun.2 без If Else функции? В моем реальном коде у меня есть 46 параметров для тестирования, поэтому уродливо писать 46, если они еще есть. Спасибо

+0

У вас есть хороший ответ, но замечание общего порядка: spacesinyourcodemakeitaloteasiertoread. – Gregor

ответ

1

Более общий подход:

fun.2 <- function(letter.to.test="a", a=2, b=3, c=4) { 
    if (letter.to.test %in% letters[1:3]) { 
     assign(letter.to.test, 1:10) 
     fun.1(a,b,c) 
    } 
} 
+0

Все ответы были полезными, но функция, которую я искал, - 'assign()'. И спасибо также за * функцию проверки с '% in%'. –

+1

Это почти «общий». Но вы используете имена аргументов в '% in%' с 'args' или' formals' –

0

Вы хотите сделать заявление switch.

fun.2<-function(letter.to.test="a",a=2,b=3,c=4){ 
    switch(letter.to.test, 
     a = {a=0:10}, 
     b = {b=0:10}, 
     c = c=0:10} 
    ) 
    return(fun.1(a,b,c)) 
} 
+0

OP все равно придется писать 46 выражений в переключателе – rawr

+0

@rawr Я сделал предположение, что выражения могут различаться между буквами. Вы правы, что 46 выражений все равно понадобятся. – cdeterman

0

Если вы хотите, чтобы они все назначенные на ту же величину (например, 0:10), попробуйте следующее:

fun.2<-function(letter.to.test="a",a=2,b=3,c=4){ 
    assign(paste(parse(text = letter.to.test)), 0:10) 
    return(fun.1(a,b,c)) 
} 
1

Вы можете подставить test значение в call до <-. Затем оцените его, чтобы изменить значения.

fun.2 <- function(test = "a", a = 2, b = 3, c = 4) { 
    eval(call("<-", as.name(substitute(test)), 0:10)) 
    fun.1(a, b, c) 
} 

fun.2() 
# [1] 73 74 75 76 77 78 79 80 81 82 83 
1

Вам не нужно fun.2

fun.1<-function(a=2,b=3,c=4) return(a+b^2+c^3) 

mapply(fun.1, a=1:10, SIMPLIFY = TRUE) 
# [1] 74 75 76 77 78 79 80 81 82 83 

mapply(fun.1, b=1:10, SIMPLIFY = TRUE) 
# [1] 67 70 75 82 91 102 115 130 147 166 
+0

Спасибо. Фактически это был пример функции с 46 параметрами, используя 3 другие функции, которые я создал. Но, может быть, я должен попробовать «mapply()». –