2015-06-09 2 views
1

Я написал функцию:Как процитировать это в R

gener1 <- function(du){ 
    nth <- paste0(paste0("dum", 1:du, " * ", "X", 1:du), collapse = " + ") 
    return(nth) 
    } 

возвращает последовательность, как:

"dum1 * X1 + dum2 * X2 + dum3 * X3" 

Теперь я хочу, чтобы использовать эту последовательность в следующей функции. Просто я могу просто скопировать и вставить, что:

S = quote(dum1 * X1 + dum2 * X2 + dum3 * X3) 

Результат:

dum1 * X1 + dum2 * X2 + dum3 * X3 

Он работает. Интересно, можно ли автоматизировать, что мне не нужно использовать «метод копирования пасты».

Конечный продукт, который я хочу добиться того, чтобы использовать S в следующей ситуации:

fo <- substitute(BH100 ~ S * ((1 - exp(-b2*TIME))/(1-exp(-b2*100)))^b3, list(S = S)) 

nls(fo, data = dane, start = list(b2 = 0.01, b3 = 1.1, X1 = 20, X2 = 20, X3 = 20)) 

Вот пример структуры данных, у меня есть

year T BH100 TIME dum1 dum2 dum3 dum4 
1987 25 12.6 25 1 0 0 0 
1990 28 14.9 28 1 0 0 0 
1994 32 18.8 32 1 0 0 0 
1983 21 13.4 21 0 1 0 0 
1986 24 16.1 24 0 1 0 0 
1990 28 19.6 28 0 1 0 0 
1998 36 26.7 36 0 1 0 0 
2002 40 27.8 40 0 1 0 0 
1994 32 17.2 32 0 0 1 0 
1998 36 19.4 36 0 0 1 0 
2002 40 23.5 40 0 0 1 0 
2008 46 26.3 46 0 0 1 0 
2013 51 28.7 51 0 0 1 0 
1985 23 14.6 23 0 0 0 1 
1989 27 18.5 27 0 0 0 1 
1990 28 19.2 28 0 0 0 1 
+4

Не очень ясно. Вы можете использовать его в «следующей функции». Возможно, вам следует предоставить немного больше контекста и описать то, что вы пытаетесь достичь. – nicola

+0

Может быть 'S <- noquote (gener1 (3)); cat (S) '? [Duplicate/Relevant post] (http://stackoverflow.com/questions/13449233/r-how-to-send-a-text-string-containing-double-quotes-to-function) – zx8754

+0

@ zx8754 Просто 'cat (gener1 (3)) 'достаточно – nicola

ответ

0

Я не уверен, что я полностью понимаю ваш вопрос, но я думаю, что вы ищете функцию eval. Ваша функция gener1 прямо сейчас генерирует строку: "dum1 * X1 + dum2 * X2 + dum3 * X3". Вы можете оценить эту строку, используя eval с parse:

expression = gener1(3) 
> expression 
[1] "dum1 * X1 + dum2 * X2 + dum3 * X3" 
evaluated_expression = eval(parse(text=expression)) 
> evaluated_expression 
[1] 68 

Так, для примера, вы можете сгенерировать строку выражения с помощью gener1 функции, а затем использовать оценочный выход в вашей fo переменный:

S = eval(parse(text = gener1(3))) 
fo <- substitute(BH100 ~ S * ((1 - exp(-b2*TIME))/(1-exp(-b2*100)))^b3, list(S = S)) 
nls(fo, data = dane, start = list(b2 = 0.01, b3 = 1.1, X1 = 20, X2 = 20, X3 = 20)) 
+0

Я сделал 'ex = gener1 (19)', чем я сделал 'eval (parse (text = ex))' error pop up 'Ошибка в eval (expr, envir, enc): object 'dum1' not found' – Mateusz1981

+0

вы можете предоставить минимальный пример вашего кода и данных, чтобы я знал, какие переменные определены в вашей среде? из вашего вопроса, похоже, что у вас уже были эти переменные «dum1», «dum2» и т. д., определенные в вашей среде. – Steve

+0

Я добавил немного данных, с которыми я работаю. Да, переменные _dum1 ect_ определены – Mateusz1981