用(cos(...))^替换cos ^ ..(...)^

时间:2019-01-19 20:56:11

标签: r string

我通过R运行WolframAlpha Wolfram Alpha API from R

我的问题是,我需要将Wolfram输出转换为R表达式。 我在需要的地方添加了“ *”,还有另一个问题-测角函数的转换。

示例:

我有: cos ^ 3(5 + 2 * x)

我需要得到:(cos(5 + 2 * x))^ 3

有人可以提示我如何实现该表达吗?还是有任何转换包?还是有人建议其他方式?

@G的

解决方案。格洛腾迪克

sub("(sin|cos|tan)\\^(\\(?-?\\d+\\)?)", "(function(x) \\1(x)^\\2)", 'cos^3(5 + 2*x)')

3 个答案:

答案 0 :(得分:4)

定义一个名为cos^3的函数,将反引号插入周围的原始字符串中并求值。

`cos^3` <- function(x) cos(x)^3
s <- sub("cos^3", "`cos^3`", input_string, fixed = TRUE)  # `cos^3`(5 + 2*x)

x <- .5  # test value for x
eval(parse(text = s))
## [1] 0.8852069

如果需要这样的话,可以概括一下:

input_string <- "cos^(3)(5+2*x)"
sub("(sin|cos|tan)\\^(\\(?-?\\d+\\)?)", "(function(x) \\1(x)^\\2)", input_string)
## [1] "(function(x) cos(x)^(3))(5+2*x)"

答案 1 :(得分:1)

我认为您拥有原始公式作为字符串,并希望在R中使用修改后的语法对其求值。您可以使用sub更改公式,然后使用parseeval对其求值。

F1 = "cos^3(5 + 2*x)"
F2 = sub("(.*)(\\^\\d)(.*)", "\\1\\3\\2", F1)
F2
[1] "cos(5 + 2*x)^3"

x = 1:4
eval(parse(text=F2))
[1]  4.284944e-01 -7.563824e-01  8.668527e-08  7.472458e-01

答案 2 :(得分:1)

这是针对您特定情况的解决方案,应该可以帮助您开始更一般的解决方案(这适用于'cos^X(Y)'形式的字符串,其中X是一些数字,而Y是一个算术表达式):

input_string <- 'cos^3(5 + 2*x)'
desired_output_string <- '(cos(5 + 2*x))^3'

convert_string <- function(s){
  return(gsub('(cos)(\\^\\d+)(\\([a-z0-9+* ]+\\))', '(\\1\\3)\\2', s))
}

output_string <- convert_string(input_string)

if (output_string == desired_output_string){
  message('the output matches!') 
} else { message('try again </3') }

然后,如果您需要实际评估字符串,则可以使用eval(parse(text=output_string)),确保其中包含的所有变量都具有值:

x <- 5
eval(parse(text=output_string))
## -0.4384354