C# R.NET Error : unexpected '}' Error
C# R.NET Error : unexpected '}' Error
我在我的程序中使用 R.NET 1.6。
当我尝试使用 source('')
运行 我的整个脚本时收到错误消息 "Attempted to read or write protected memory. This is often an indication that other memory is corrupt" 所以我手动编写了整个代码调用脚本是因为我在某处读到它是 R.NET 错误之一。这是代码:
engine.Evaluate("U=matrix(ncol=c,nrow=nrow(matdt))");
engine.Evaluate("for(i in 1:nrow(matdt)){for(j in 1:c){U[i,j]=runif(1)}}");
engine.Evaluate("totU=matrix(rowSums(U),ncol=1,nrow=nrow(U))");
engine.Evaluate("for(a in 1:nrow(U)){for(b in 1:ncol(U)){U[a,b]=U[a,b]/totU[a,]}}");
engine.Evaluate("P=0");
engine.Evaluate("iter=1");
engine.Evaluate("repeat{");
engine.Evaluate("V=matrix(ncol=ncol(matdt),nrow=c)");
engine.Evaluate("d=matrix(ncol=ncol(matdt),nrow=nrow(matdt))");
engine.Evaluate("Uk=matrix(ncol=ncol(U),nrow=nrow(U))");
engine.Evaluate("for(g in 1:nrow(U)){for(h in 1:ncol(U)){Uk[g,h]=(U[g,h])^(m)}}"); engine.Evaluate("Uks=matrix(colSums(Uk),ncol=ncol(Uk),nrow=1)");
engine.Evaluate("for(k in 1:c){for(j in 1:nrow(matdt)){d[j,]=Uk[j,k]*matdt[j,]}");
engine.Evaluate("V[k,]=colSums(d)/Uks[,k]}");
engine.Evaluate("dist=matrix(ncol=1,nrow=nrow(matdt))");
engine.Evaluate("alldist=matrix(ncol=c,nrow=nrow(matdt))");
engine.Evaluate("for(l in 1:c){for(n in 1:nrow(matdt)){dist[n,]=t(matdt[n,]-V[l,])%*%(matdt[n,]-V[l,])}");
engine.Evaluate("alldist[,l]=dist}");
engine.Evaluate("ud=matrix(ncol=c,nrow=nrow(matdt))");
engine.Evaluate("for(o in 1:nrow(matdt)){for(p in 1:c){ud[o,p]=alldist[o,p]*Uk[o,p]}}");
engine.Evaluate("Pi=sum(rowSums(ud))");
engine.Evaluate("P=abs(Pi-P)");
engine.Evaluate("alldist2=matrix(ncol=ncol(alldist),nrow=nrow(alldist))");
engine.Evaluate("for(q in 1:nrow(alldist)){for(r in 1:ncol(alldist)){alldist2[q,r]=(alldist[q,r])^((-1)/(m-1))}}");
engine.Evaluate("alldist2[alldist2==Inf] <- 0 ");
engine.Evaluate("totdist=matrix(rowSums(alldist2),ncol=1,nrow=nrow(alldist2))");
engine.Evaluate("for(s in 1:nrow(U)){for(t in 1:ncol(U)){U[s,t]=alldist2[s,t]/totdist[s,]}}");
engine.Evaluate("nilnol<-which(U==0,arr.in=TRUE)");
engine.Evaluate("if(nrow(nilnol)>0){nilnol=matrix(nilnol,ncol=ncol(nilnol))");
engine.Evaluate("for(nn in 1:nrow(nilnol)){"); engine.Evaluate("U[nilnol[nn,1],]=0"); engine.Evaluate("U[nilnol[nn,1],nilnol[nn,2]]=1}}");
engine.Evaluate("iter=iter+1");
engine.Evaluate("if(P<e | iter>mit){break}}");
我在 engine.Evaluate("V[k,]=colSums(d)/Uks[,k]}");
处收到错误消息 意外 '}'。这是循环的一部分:
engine.Evaluate("for(k in 1:c){for(j in 1:nrow(matdt)){d[j,]=Uk[j,k]*matdt[j,]}");
engine.Evaluate("V[k,]=colSums(d)/Uks[,k]}");
当我尝试在 R 中 运行 时代码工作正常。此外,如果有人有解决错误问题的方法,我们将不胜感激。
无需多次调用 engine.Evaluate()
,您可以构造更长的 R 命令字符串并将它们送入更少的调用中。但是,您需要有策略地放置分号;在常规 R 代码中需要换行的任何地方现在都需要分号。
在您的情况下,您需要在 for
循环的右括号后加一个分号。
string cmd =
"for (k in 1:c) {" +
"for (j in 1:nrow(matdt)) {" +
"d[j, ] = Uk[j, k]*matdt[j, ]" +
"};" + /* <---- Note the semicolon */
"V[k, ] = colSums(d) / Uks[, k]" +
"};"; /* <---- Another just to be safe */
engine.Evaluate(cmd);
由于输入字符串中没有嵌入换行符,R 实际看到的代码是这样的:
for (k in 1:c) {for (j in 1:nrow(matdt)) {d[j, ] = Uk[j, k]*matdt[j, ]};V[k, ] = colSums(d) / Uks[, k]};
一个可能也有效的更简单的解决方案是传递包含换行符的 C# 字符串文字。
string cmd = @"for (k in 1:c) {
for (j in 1:nrow(matdt)) {
d[j, ] = Uk[k, j]*matdt[j, ]
}
V[k, ] = colSums(d) / Uks[, k]
}";
换行符现在嵌入到字符串中,因此当它传递给 engine.Evaluate()
时,R 也会看到换行符,从而不需要分号。
我在我的程序中使用 R.NET 1.6。
当我尝试使用 source('')
运行 我的整个脚本时收到错误消息 "Attempted to read or write protected memory. This is often an indication that other memory is corrupt" 所以我手动编写了整个代码调用脚本是因为我在某处读到它是 R.NET 错误之一。这是代码:
engine.Evaluate("U=matrix(ncol=c,nrow=nrow(matdt))");
engine.Evaluate("for(i in 1:nrow(matdt)){for(j in 1:c){U[i,j]=runif(1)}}");
engine.Evaluate("totU=matrix(rowSums(U),ncol=1,nrow=nrow(U))");
engine.Evaluate("for(a in 1:nrow(U)){for(b in 1:ncol(U)){U[a,b]=U[a,b]/totU[a,]}}");
engine.Evaluate("P=0");
engine.Evaluate("iter=1");
engine.Evaluate("repeat{");
engine.Evaluate("V=matrix(ncol=ncol(matdt),nrow=c)");
engine.Evaluate("d=matrix(ncol=ncol(matdt),nrow=nrow(matdt))");
engine.Evaluate("Uk=matrix(ncol=ncol(U),nrow=nrow(U))");
engine.Evaluate("for(g in 1:nrow(U)){for(h in 1:ncol(U)){Uk[g,h]=(U[g,h])^(m)}}"); engine.Evaluate("Uks=matrix(colSums(Uk),ncol=ncol(Uk),nrow=1)");
engine.Evaluate("for(k in 1:c){for(j in 1:nrow(matdt)){d[j,]=Uk[j,k]*matdt[j,]}");
engine.Evaluate("V[k,]=colSums(d)/Uks[,k]}");
engine.Evaluate("dist=matrix(ncol=1,nrow=nrow(matdt))");
engine.Evaluate("alldist=matrix(ncol=c,nrow=nrow(matdt))");
engine.Evaluate("for(l in 1:c){for(n in 1:nrow(matdt)){dist[n,]=t(matdt[n,]-V[l,])%*%(matdt[n,]-V[l,])}");
engine.Evaluate("alldist[,l]=dist}");
engine.Evaluate("ud=matrix(ncol=c,nrow=nrow(matdt))");
engine.Evaluate("for(o in 1:nrow(matdt)){for(p in 1:c){ud[o,p]=alldist[o,p]*Uk[o,p]}}");
engine.Evaluate("Pi=sum(rowSums(ud))");
engine.Evaluate("P=abs(Pi-P)");
engine.Evaluate("alldist2=matrix(ncol=ncol(alldist),nrow=nrow(alldist))");
engine.Evaluate("for(q in 1:nrow(alldist)){for(r in 1:ncol(alldist)){alldist2[q,r]=(alldist[q,r])^((-1)/(m-1))}}");
engine.Evaluate("alldist2[alldist2==Inf] <- 0 ");
engine.Evaluate("totdist=matrix(rowSums(alldist2),ncol=1,nrow=nrow(alldist2))");
engine.Evaluate("for(s in 1:nrow(U)){for(t in 1:ncol(U)){U[s,t]=alldist2[s,t]/totdist[s,]}}");
engine.Evaluate("nilnol<-which(U==0,arr.in=TRUE)");
engine.Evaluate("if(nrow(nilnol)>0){nilnol=matrix(nilnol,ncol=ncol(nilnol))");
engine.Evaluate("for(nn in 1:nrow(nilnol)){"); engine.Evaluate("U[nilnol[nn,1],]=0"); engine.Evaluate("U[nilnol[nn,1],nilnol[nn,2]]=1}}");
engine.Evaluate("iter=iter+1");
engine.Evaluate("if(P<e | iter>mit){break}}");
我在 engine.Evaluate("V[k,]=colSums(d)/Uks[,k]}");
处收到错误消息 意外 '}'。这是循环的一部分:
engine.Evaluate("for(k in 1:c){for(j in 1:nrow(matdt)){d[j,]=Uk[j,k]*matdt[j,]}");
engine.Evaluate("V[k,]=colSums(d)/Uks[,k]}");
当我尝试在 R 中 运行 时代码工作正常。此外,如果有人有解决错误问题的方法,我们将不胜感激。
无需多次调用 engine.Evaluate()
,您可以构造更长的 R 命令字符串并将它们送入更少的调用中。但是,您需要有策略地放置分号;在常规 R 代码中需要换行的任何地方现在都需要分号。
在您的情况下,您需要在 for
循环的右括号后加一个分号。
string cmd =
"for (k in 1:c) {" +
"for (j in 1:nrow(matdt)) {" +
"d[j, ] = Uk[j, k]*matdt[j, ]" +
"};" + /* <---- Note the semicolon */
"V[k, ] = colSums(d) / Uks[, k]" +
"};"; /* <---- Another just to be safe */
engine.Evaluate(cmd);
由于输入字符串中没有嵌入换行符,R 实际看到的代码是这样的:
for (k in 1:c) {for (j in 1:nrow(matdt)) {d[j, ] = Uk[j, k]*matdt[j, ]};V[k, ] = colSums(d) / Uks[, k]};
一个可能也有效的更简单的解决方案是传递包含换行符的 C# 字符串文字。
string cmd = @"for (k in 1:c) {
for (j in 1:nrow(matdt)) {
d[j, ] = Uk[k, j]*matdt[j, ]
}
V[k, ] = colSums(d) / Uks[, k]
}";
换行符现在嵌入到字符串中,因此当它传递给 engine.Evaluate()
时,R 也会看到换行符,从而不需要分号。