在没有 yacas 的 R 中符号化地对方程进行算术运算
Arithmetical operations on equations symbolicaly in R without yacas
我定义了像f<-"x^2"
和g<-"y^2"
这样的方程式。我想获得像 z<-(x^2)*(y^2)
这样的等式 z。
'Class(f)'、'class(g)' 和 'class(z)' 值对我来说并不重要。
我试过这个:
> f<-"x^2"
> g<-"y^2"
> z<-f*g
我得到了:
Error in f * g : non-numeric argument to binary operator<br/>
我尝试将 f<-expression(f)
和 g<-expression(g)
相乘,但没有结果。
我也试过:
> f<-function(x) x^2
> g<-function(y) y^2
> z<-function(x,y) f*g
> z<-parse(text=z)
我得到了:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
用paste(z)
代替parse(z)
:
> paste(z)
Error in paste(z) :
cannot coerce type 'closure' to vector of type 'character'
有没有办法在不使用 yacas 等重型软件的情况下用 R 中的方程式进行符号运算?
您可以尝试以下方法:
f <- expression(x^2)
g <- expression(y^2)
z <- expression(eval(f) * eval(g))
#> eval(z,list(x = 1, y = 2))
#[1] 4
#...and here's another test, just to be sure:
#> identical(eval(z, list(x = 17, y = 21)), 17^2 * 21^2)
#[1] TRUE
或者您可以使用 rSymPy
包:
library(rSymPy)
x <- Var("x")
y <- Var("y")
sympy("f = x**2")
sympy("g = y**2")
sympy("z = f * g")
#> sympy("z")
#[1] "x**2*y**2"
#> sympy("z.subs([(x,3),(y,2)])")
#[1] "36"
第二个建议可能不是很有吸引力,因为它可能更容易直接使用 Python
。
你对符号和函数的使用很混乱。如果你想使用 "pieces" 的语言对象,你会使用更像
的东西
f <- quote(x^2)
g <- quote(y^2)
z <- quote(f*g)
do.call("substitute", list(z, list(f=f, g=g)))
# x^2 * y^2
如果您只想要某种形式的函数组合,只需确保将变量视为函数
f <- function(x) x^2
g <- function(y) y^2
z <- function(x,y) f(x)*g(y)
但这些只是构建R语言元素的方法。将这些视为代数运算是不明智的。 R 不会尝试简化或类似的东西。
我定义了像f<-"x^2"
和g<-"y^2"
这样的方程式。我想获得像 z<-(x^2)*(y^2)
这样的等式 z。
'Class(f)'、'class(g)' 和 'class(z)' 值对我来说并不重要。
我试过这个:
> f<-"x^2"
> g<-"y^2"
> z<-f*g
我得到了:
Error in f * g : non-numeric argument to binary operator<br/>
我尝试将 f<-expression(f)
和 g<-expression(g)
相乘,但没有结果。
我也试过:
> f<-function(x) x^2
> g<-function(y) y^2
> z<-function(x,y) f*g
> z<-parse(text=z)
我得到了:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
用paste(z)
代替parse(z)
:
> paste(z)
Error in paste(z) :
cannot coerce type 'closure' to vector of type 'character'
有没有办法在不使用 yacas 等重型软件的情况下用 R 中的方程式进行符号运算?
您可以尝试以下方法:
f <- expression(x^2)
g <- expression(y^2)
z <- expression(eval(f) * eval(g))
#> eval(z,list(x = 1, y = 2))
#[1] 4
#...and here's another test, just to be sure:
#> identical(eval(z, list(x = 17, y = 21)), 17^2 * 21^2)
#[1] TRUE
或者您可以使用 rSymPy
包:
library(rSymPy)
x <- Var("x")
y <- Var("y")
sympy("f = x**2")
sympy("g = y**2")
sympy("z = f * g")
#> sympy("z")
#[1] "x**2*y**2"
#> sympy("z.subs([(x,3),(y,2)])")
#[1] "36"
第二个建议可能不是很有吸引力,因为它可能更容易直接使用 Python
。
你对符号和函数的使用很混乱。如果你想使用 "pieces" 的语言对象,你会使用更像
的东西f <- quote(x^2)
g <- quote(y^2)
z <- quote(f*g)
do.call("substitute", list(z, list(f=f, g=g)))
# x^2 * y^2
如果您只想要某种形式的函数组合,只需确保将变量视为函数
f <- function(x) x^2
g <- function(y) y^2
z <- function(x,y) f(x)*g(y)
但这些只是构建R语言元素的方法。将这些视为代数运算是不明智的。 R 不会尝试简化或类似的东西。