Преобразуйте строку выражения в выражение с кавычками

Как я могу преобразовать строку выражения в выражении в кавычках?

Пример: это результат, который я хочу:

mutate(mtcars,answer=wt+wt)
# mpg   cyl disp  hp  drat wt    qsec   vs  am   gear carb    answer
# 1  21.0  6   160.0 110 3.90 2.620 16.46  0   1    4    4    5.240
# 2  21.0  6   160.0 110 3.90 2.875 17.02  0   1    4    4    5.750
# 3  22.8  4   108.0  93 3.85 2.320 18.61  1   1    4    1    4.640
# 4  21.4  6   258.0 110 3.08 3.215 19.44  1   0    3    1    6.430
# 5  18.7  8   360.0 175 3.15 3.440 17.02  0   0    3    2    6.880
# 6  18.1  6   225.0 105 2.76 3.460 20.22  1   0    3    1    6.920 
... 

Вот функция, которую я пишу:

f<-function(df,string_expression){
    se<-enexpr(string_expression)
    mutate(df,answer=!!se)
}

Это будет работать, если я использую следующий функциональный вызов:

f(mtcars,wt+wt)
# mpg   cyl disp  hp  drat wt    qsec   vs  am   gear carb    answer
# 1  21.0  6   160.0 110 3.90 2.620 16.46  0   1    4    4    5.240
# 2  21.0  6   160.0 110 3.90 2.875 17.02  0   1    4    4    5.750
# 3  22.8  4   108.0  93 3.85 2.320 18.61  1   1    4    1    4.640
# 4  21.4  6   258.0 110 3.08 3.215 19.44  1   0    3    1    6.430
# 5  18.7  8   360.0 175 3.15 3.440 17.02  0   0    3    2    6.880
# 6  18.1  6   225.0 105 2.76 3.460 20.22  1   0    3    1    6.920 
... 

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

f(mtcars,'wt+wt')
#    mpg   cyl disp  hp  drat wt    qsec   vs  am   gear carb answer
# 1  21.0  6   160.0 110 3.90 2.620 16.46  0   1    4    4    wt+wt
# 2  21.0  6   160.0 110 3.90 2.875 17.02  0   1    4    4    wt+wt
# 3  22.8  4   108.0  93 3.85 2.320 18.61  1   1    4    1    wt+wt
# 4  21.4  6   258.0 110 3.08 3.215 19.44  1   0    3    1    wt+wt
# 5  18.7  8   360.0 175 3.15 3.440 17.02  0   0    3    2    wt+wt
...

Как мне сделать это (изменить определение функции или вызов функции), чтобы получить желаемый результат?

Что я пробовал:

  • Я попытался sym(string_expression) - не работает.

  • Я пытался кво (string_expression) - не работает.

Спасибо!

1 ответ

Решение

Вы можете изменить свою функцию f на что-то такое:

f<-function(df,string_expression){
mutate(df, answer = eval(parse(text = string_expression)))
}

head(f(mtcars,'wt+wt'))
   mpg cyl disp  hp drat    wt  qsec vs am gear carb answer
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   5.24
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   5.75
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   4.64
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   6.43
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   6.88
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   6.92
Другие вопросы по тегам