Ошибка С# R.NET: непредвиденная ошибка '}'

Я использую R.NET 1.6 в своей программе.

Я получил сообщение об ошибке "Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена", когда я попытался запустить весь свой скрипт с помощью source(''), поэтому я написал весь код вручную, а не вызывая скрипт, потому что я где-то читал, что это одна из ошибок 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. Также, если у кого-то есть решение проблемы с ошибкой, я был бы очень признателен.


person geeqy    schedule 07.05.2015    source источник
comment
Вы пытались построить цикл как одну строку, а затем передать всю эту строку одному engine.Evaluate()?   -  person Alex A.    schedule 07.05.2015
comment
@АлексА. да, я сделал, и я получил ошибку Ошибка: неожиданный символ в for (k в 1: c) {for (j в 1: nrow (matdt)) {d [j,] = (Uk [j, k]) * matdt [ j,]}V, даже когда я запускал его на R   -  person geeqy    schedule 07.05.2015
comment
Если это на одной строке, то вам нужна точка с запятой после закрывающей скобки.   -  person Alex A.    schedule 07.05.2015
comment
@АлексА. это работает сейчас. Огромное спасибо   -  person geeqy    schedule 07.05.2015
comment
Без проблем. Я опубликую это как ответ.   -  person Alex A.    schedule 07.05.2015


Ответы (1)


Вместо многочисленных вызовов 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 также увидит разрывы строк, что делает точку с запятой ненужной.

person Alex A.    schedule 07.05.2015