R 有没有工具可以绘制连接方程式的图表?

R 有没有工具可以绘制连接方程式的图表?,r,matlab,workflow,diagram,flowchart,R,Matlab,Workflow,Diagram,Flowchart,实际上,我不知道怎么问这个问题。但我有一组方程和常数,它们都是以某种方式连接起来的。例如,让我们用Matlab编写以下代码: R=8.314; n=0.412; a=4; m=2; S=10; rho=1; F=m*a; P=F/S; V=m/rho; T=(P*V)/(n*R); 有没有一种方法可以让Matlab(或其他语言)返回一个带有工作流的图表,或者类似的图形 因为我认为任何语言都需要按顺序定义每个常数和方程,所以我只希望在R中使用如图所示的IGRAPHE包返回该顺序。我们假设输入是

实际上,我不知道怎么问这个问题。但我有一组方程和常数,它们都是以某种方式连接起来的。例如,让我们用Matlab编写以下代码:

R=8.314;
n=0.412;
a=4;
m=2;
S=10;
rho=1;
F=m*a;
P=F/S;
V=m/rho;
T=(P*V)/(n*R);
有没有一种方法可以让Matlab(或其他语言)返回一个带有工作流的图表,或者类似的图形


因为我认为任何语言都需要按顺序定义每个常数和方程,所以我只希望在R中使用如图所示的IGRAPHE包返回该顺序。我们假设输入是结尾注释中显示的字符串

使用
scan
scan
也可以从文件中读取内容,但为了保持内容的完整性,我们在此处使用字符串作为输入),删除空组件并去掉空白

提取每条线的左侧和右侧

然后,对于
rhs
的每个元素,获取其中的变量,给出列表L。用variable=expression形式的字符标签替换名称

转换为数据帧,并从数据帧转换为igraph对象
g
,然后进行绘图

library(igraph)
set.seed(123)

V1 <- scan(text = Lines, sep = ";", what = "", quiet = TRUE)
V1 <- gsub(" ", "", V1[V1 != ""])

lhs <- sub("=.*", "", V1)
rhs <- sub(".*=", "", V1)

L <- setNames(lapply(rhs, function(x) all.vars(parse(text = x))), V1)
L <- lapply(L, function(x) ifelse(x %in% lhs, 
  paste0(x, "=", rhs[match(x, lhs)]), x))

g <- graph.data.frame(stack(L))
plot(g, vertex.color = NA, vertex.frame.color = NA)
m <- as.matrix(get.adjacency(g))
m <- m[apply(m > 0, 1, any), apply(m > 0, 2, any)] # rm 0 rows & cols
heatmap(m, Rowv = NA, Colv = NA, col = 2:3, scale = "none", 
  margins = c(7, 7), cexCol = 1, cexRow = 1)

正文 另一种可能是仅使用文本显示依赖项。如果您想查看没有依赖项的组件,请只显示
L

L[lengths(L) > 0]
给予:

$`F=m*a`
[1] "m=2" "a=4"

$`P=F/S`
[1] "F=m*a" "S=10" 
 
$`V=m/rho`
[1] "m=2"   "rho=1"

$`T=(P*V)/(n*R)`
[1] "P=F/S"   "V=m/rho" "n=0.412" "R=8.314"
$`a=4`
[1] "F=m*a"

$`F=m*a`
[1] "P=F/S"

$`m=2`
[1] "F=m*a"   "V=m/rho"

$`n=0.412`
[1] "T=(P*V)/(n*R)"

$`P=F/S`
[1] "T=(P*V)/(n*R)"

$`R=8.314`
[1] "T=(P*V)/(n*R)"

$`rho=1`
[1] "V=m/rho"

$`S=10`
[1] "P=F/S"

$`V=m/rho`
[1] "T=(P*V)/(n*R)"
以及颠倒列表:

lapply(split(stack(L), stack(L)$values), function(x) as.character(x$ind))
给予:

$`F=m*a`
[1] "m=2" "a=4"

$`P=F/S`
[1] "F=m*a" "S=10" 
 
$`V=m/rho`
[1] "m=2"   "rho=1"

$`T=(P*V)/(n*R)`
[1] "P=F/S"   "V=m/rho" "n=0.412" "R=8.314"
$`a=4`
[1] "F=m*a"

$`F=m*a`
[1] "P=F/S"

$`m=2`
[1] "F=m*a"   "V=m/rho"

$`n=0.412`
[1] "T=(P*V)/(n*R)"

$`P=F/S`
[1] "T=(P*V)/(n*R)"

$`R=8.314`
[1] "T=(P*V)/(n*R)"

$`rho=1`
[1] "V=m/rho"

$`S=10`
[1] "P=F/S"

$`V=m/rho`
[1] "T=(P*V)/(n*R)"

R中的
行使用如图所示的igraph包。我们假设输入是结尾注释中显示的字符串

使用
scan
scan
也可以从文件中读取内容,但为了保持内容的完整性,我们在此处使用字符串作为输入),删除空组件并去掉空白

提取每条线的左侧和右侧

然后,对于
rhs
的每个元素,获取其中的变量,给出列表L。用variable=expression形式的字符标签替换名称

转换为数据帧,并从数据帧转换为igraph对象
g
,然后进行绘图

library(igraph)
set.seed(123)

V1 <- scan(text = Lines, sep = ";", what = "", quiet = TRUE)
V1 <- gsub(" ", "", V1[V1 != ""])

lhs <- sub("=.*", "", V1)
rhs <- sub(".*=", "", V1)

L <- setNames(lapply(rhs, function(x) all.vars(parse(text = x))), V1)
L <- lapply(L, function(x) ifelse(x %in% lhs, 
  paste0(x, "=", rhs[match(x, lhs)]), x))

g <- graph.data.frame(stack(L))
plot(g, vertex.color = NA, vertex.frame.color = NA)
m <- as.matrix(get.adjacency(g))
m <- m[apply(m > 0, 1, any), apply(m > 0, 2, any)] # rm 0 rows & cols
heatmap(m, Rowv = NA, Colv = NA, col = 2:3, scale = "none", 
  margins = c(7, 7), cexCol = 1, cexRow = 1)

正文 另一种可能是仅使用文本显示依赖项。如果您想查看没有依赖项的组件,请只显示
L

L[lengths(L) > 0]
给予:

$`F=m*a`
[1] "m=2" "a=4"

$`P=F/S`
[1] "F=m*a" "S=10" 
 
$`V=m/rho`
[1] "m=2"   "rho=1"

$`T=(P*V)/(n*R)`
[1] "P=F/S"   "V=m/rho" "n=0.412" "R=8.314"
$`a=4`
[1] "F=m*a"

$`F=m*a`
[1] "P=F/S"

$`m=2`
[1] "F=m*a"   "V=m/rho"

$`n=0.412`
[1] "T=(P*V)/(n*R)"

$`P=F/S`
[1] "T=(P*V)/(n*R)"

$`R=8.314`
[1] "T=(P*V)/(n*R)"

$`rho=1`
[1] "V=m/rho"

$`S=10`
[1] "P=F/S"

$`V=m/rho`
[1] "T=(P*V)/(n*R)"
以及颠倒列表:

lapply(split(stack(L), stack(L)$values), function(x) as.character(x$ind))
给予:

$`F=m*a`
[1] "m=2" "a=4"

$`P=F/S`
[1] "F=m*a" "S=10" 
 
$`V=m/rho`
[1] "m=2"   "rho=1"

$`T=(P*V)/(n*R)`
[1] "P=F/S"   "V=m/rho" "n=0.412" "R=8.314"
$`a=4`
[1] "F=m*a"

$`F=m*a`
[1] "P=F/S"

$`m=2`
[1] "F=m*a"   "V=m/rho"

$`n=0.412`
[1] "T=(P*V)/(n*R)"

$`P=F/S`
[1] "T=(P*V)/(n*R)"

$`R=8.314`
[1] "T=(P*V)/(n*R)"

$`rho=1`
[1] "V=m/rho"

$`S=10`
[1] "P=F/S"

$`V=m/rho`
[1] "T=(P*V)/(n*R)"

行欢迎使用堆栈溢出。这是一个很好的问题。我还没有看到有人构建它,但它将是教授“编程入门”课程的一个很好的工具。像MATLAB这样的解释器不会在内部构建这样的图形。相反,每行代码依次执行。如果在执行时,一行引用了一个不存在的变量,则程序有错误。因此,是程序员在心理上做出了这样的图形,而不是解释器。另一方面,优化编译器(如C或C++编译器)会在内部构建这样一个图,作为用于优化操作顺序的代码分析的一部分,并查找由于结果未被使用而根本不需要执行的冗余操作。欢迎使用堆栈溢出。这是一个很好的问题。我还没有看到有人构建它,但它将是教授“编程入门”课程的一个很好的工具。像MATLAB这样的解释器不会在内部构建这样的图形。相反,每行代码依次执行。如果在执行时,一行引用了一个不存在的变量,则程序有错误。因此,是程序员在心理上做出了这样的图形,而不是解释器。另一方面,优化编译器(如C或C++)会在内部构建这样一个图,作为用于优化操作顺序的代码分析的一部分,并查找由于结果未被使用而根本不需要执行的冗余操作。感谢您的回复,非常有帮助!。我试过了,但问题是我有很多方程和常数,有些方程很大,所以看起来不太好。因此,我有两个想法来改进它:1)在我所附的图中,有一种公式的层次结构,而不是随机性(如图所示)。有办法吗?2) 有没有办法不写方程式而只写字母?例如,如果定义L的两条语句被替换为
L,则类似于a->F,谢谢!对于层次结构样式呢?例如,顶部和最后一个等式T=(PV)/(nR)和底部的常数?igraph有关于如何手动指定节点位置的文档。感谢您的回复,非常有用!。我试过了,但问题是我有很多方程和常数,有些方程很大,所以看起来不太好。因此,我有两个想法来改进它:1)在我所附的图中,有一种公式的层次结构,而不是随机性(如图所示)。有办法吗?2) 有没有办法不写方程式而只写字母?例如,如果定义L的两条语句被替换为
L,则类似于a->F,谢谢!对于层次结构样式呢?例如,顶部和最后一个等式T=(PV)/(nR)和底部的常数?igraph有关于如何手动指定节点位置的文档。