-------- Original Message --------
Subject: Re: [Rd] Cannot Compute Box's M (Three Days Trying...)
Local Time: October 28, 2017 4:51 PM
UTC Time: October 28, 2017 8:51 PM
From: murdoch.dun...@gmail.com
To: Morkus <mor...@protonmail.com>
r-devel@r-project.org <r-devel@r-project.org>
On 28/10/2017 8:59 AM, Morkus wrote:
Hey Duncan,
Hard to debug? That's an understatement. Eyes bleeding....
In any case, I tried all your suggestions. To get "integer" for the
final column, I had to change the code to get integers instead of
strings.
The last column in iris is actually a factor. That's stored as an
S3-classed integer vector with an attribute listing the levels. Using
strings instead can cause problems in a few R functions (they want
factors, and don't do automatic conversions), but the errors you're
seeing seem more fundamental.
double[] d1 = ((REXPVector) ((RList) tableRead).get(0)).asDoubles();
double[] d2 = ((REXPVector) ((RList) tableRead).get(1)).asDoubles();
double[] d3 = ((REXPVector) ((RList) tableRead).get(2)).asDoubles();
double[] d4 = ((REXPVector) ((RList) tableRead).get(3)).asDoubles();
/int/*[] d5 = ((REXPVector) ((RList)
tableRead).get(*4*)).asIntegers();*
/// create data frame with data.
/REXP myDf = REXP.createDataFrame(new RList(
new REXP[]
{
new REXPDouble(d1),
new REXPDouble(d2),
new REXPDouble(d3),
new REXPDouble(d4),
*new */REXPInteger(d5)/
}));
Here are the results from the eval debug code.
head(boxMVariable) — Gives the high level 5 objects.
typeof(boxMVariable): “list”
class(boxMVariable) : “data.frame”
names(boxMVariable) — String object returned (couldn't evaluate it)
That sounds like it could be serious. Dataframe names shouldn't be
particularly complicated, so there shouldn't be a problem evaluating
them. (But maybe this is just hard in Java for some reason. As I've
mentioned, I'm not familiar with the R Java interface.) If there
really
is a problem with the way the names have been constructed, that would
explain the error in str(), and would lead to lots of other weird
problems.
Another way to look at R objects from within R is to use
.Internal(inspect( x )). For example,
.Internal(inspect(names(iris)))
@7f898ff9e2e8 16 STRSXP g0c4 [NAM(2)] (len=5, tl=0)
@7f8992c41878 09 CHARSXP g0c2 [gp=0x61,ATT] [ASCII] [cached]
"Sepal.Length"
@7f8992c41840 09 CHARSXP g0c2 [gp=0x61] [ASCII] [cached] "Sepal.Width"
@7f8992c41808 09 CHARSXP g0c2 [gp=0x61,ATT] [ASCII] [cached]
"Petal.Length"
@7f898ba99f78 09 CHARSXP g0c2 [gp=0x61,ATT] [ASCII] [cached]
"Petal.Width"
@7f898b9a3468 09 CHARSXP g0c1 [gp=0x61,ATT] [ASCII] [cached] "Species"
You can also look at R objects while in a debugger like gdb using the
R_PV() function; see Writing R Extensions for details if this is
something available to you.
ncol(boxMVariable) - 5
nrow(boxMVariable) - 150
typeof(boxMVariable)
for (i in 1:5) print(typeof(boxMVariable[[i]]))
/I get:/
1 —> double
2 —> double
3 —> double
4 —> double
5 -> integer
Is this problem "debug-proof"?
Does anyone out there actually use Java and R?
I don't know anyone who does that. It seems like a bad idea just
because it's always easiest to do what everyone else does.
I think it's more common to call Java from R than the reverse.
Duncan Murdoch
Sigh...
Sent from ProtonMail https://protonmail.com, Swiss-based encrypted
email.
-------- Original Message --------
Subject: Re: [Rd] Cannot Compute Box's M (Three Days Trying...)
Local Time: October 28, 2017 7:31 AM
UTC Time: October 28, 2017 11:31 AM
From: murdoch.dun...@gmail.com <mailto:murdoch.dun...@gmail.com>
To: Morkus mor...@protonmail.com <mailto:mor...@protonmail.com>
r-devel@r-project.org <mailto:r-devel@r-project.org>
r-devel@r-project.org <mailto:r-devel@r-project.org>
On 28/10/2017 7:12 AM, Morkus wrote:
|Thanks Duncan. Awesome ideas! I think we're getting closer! I
tried what you suggested and got a possibly better error... .
. . rConnection.assign("boxMVariable", myDf); *String resultBV
*= /"str(boxMVariable)"/; /// your suggestion./ /RESULTING
ERROR:/ /Error in format.default(nam.ob, width = max(ncn),
justify = "left") : invalid 'width' argument/ (No idea what
this means). That looks like an error occurring in the str()
function. I've never seen such a think in a regular R session,
so I would guess that either your boxMVariable object is set
up in a weird way that is confusing str(), or your R session
in Java is messed up. This is likely to be pretty hard to
debug. As a general strategy, I'd try to find out exactly what
is in boxMVariable first. Since str() doesn't work, try
printing things like head(boxMVariable) class(boxMVariable)
names(boxMVariable) ncol(boxMVariable) nrow(boxMVariable)
typeof(boxMVariable) for (i in 1:5)
print(typeof(boxMVariable[[i]])) etc. Make sure the values
match what you see in a regular R session: boxMVariable <-
iris head(boxMVariable) Sepal.Length Sepal.Width Petal.Length
Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2
setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0
3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa
class(boxMVariable) [1] "data.frame" names(boxMVariable) [1]
"Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
"Species" ncol(boxMVariable) [1] 5 nrow(boxMVariable) [1] 150
typeof(boxMVariable) [1] "list" for (i in 1:5) |
*
print(typeof(boxMVariable[[i]]))
[1] "double"
[1] "double"
[1] "double"
[1] "double"
[1] "integer"
For testing, I'm using the same standard IRIS dataset as
the Box's M
documentation shows in biotools:
Examples
data(iris)
/boxM(iris[, -5], iris[, 5])/
/-------/
**
Now, in the debugger, the built values of myDf are these:
/myDf/ = {org.rosuda.REngine.REXPGenericVector@562}
"org.rosuda.REngine./REXPGenericVector/@17d99928+[5]”
▼ payload = {org.rosuda.REngine./RList/@566} size = 5
► 0 = {org.rosuda.REngine.REXPDouble@570}
"org.rosuda.REngine./REXPDouble/@6fffcba5[150]"
► 1 = {org.rosuda.REngine.REXPDouble@571}
"org.rosuda.REngine./REXPDouble/@34340fab[150]”
► 2 = {org.rosuda.REngine.REXPDouble@572}
"org.rosuda.REngine./REXPDouble/@2aafb23c[150]"
► 3 = {org.rosuda.REngine.REXPDouble@573}
"org.rosuda.REngine./REXPDouble/@2b80d80f[150]”
► 4 = {org.rosuda.REngine.REXPString@574}
"org.rosuda.REngine./REXPString/@3ab39c39[150]”
Does this help?
Please let me know what else I can try.
Thanks,
Sent from ProtonMail https://protonmail.com, Swiss-based
encrypted
email.
|-------- Original Message -------- Subject: Re: [Rd]
Cannot Compute Box's M (Three Days Trying...) Local Time:
October 28, 2017 6:48 AM UTC Time: October 28, 2017 10:48
AM From: murdoch.dun...@gmail.com
<mailto:murdoch.dun...@gmail.com> To: Morkus
mor...@protonmail.com <mailto:mor...@protonmail.com>
r-devel@r-project.org <mailto:r-devel@r-project.org>
r-devel@r-project.org <mailto:r-devel@r-project.org> On
28/10/2017 6:26 AM, Morkus wrote: |I'm not sure what you
mean. Could you please be more specific? You were trying
to eval an expression that you constructed in Java. I was
suggesting that before you eval it, you print it. If I
print the string, I get: /boxM(boxMVariable[, -5],
boxMVariable[, 5])/ Right, that's what I was suggesting
you do. Now you've fixed the syntax error, that looks
okay. If I'm reading these messages in the right order,
your latest error is Error in |[.data.frame|(boxMVariable,
, -5) : undefined columns selected The expression there is
a funny way of printing boxMVariable[,-5]. So now you need
to figure out why it thinks you've selected undefined
columns. This is a little perplexing, because you're
asking for all columns except column 5, and that works
whether or not you have a column | 5. So I'd guess there's
something weird about boxMVariable. You should ask R to
print it, and to print str(boxMVariable), to make sure
it's a regular dataframe containing 4 numeric columns and
one factor or character column. Duncan Murdoch |From this
code: . . . /// assign the data to a variable.
/rConnection.assign("boxMVariable", myDf); /// create a
string command with that variable name. /String
boxVariable = "boxM(boxMVariable[, -5], boxMVariable[,
5])"; /System/./out/./println/(/boxVariable/); // print
the string? Not sure what is meant. Sorry if I didn't
understand your suggestion. Look forward to hearing back
from you. Thanks, Sent from ProtonMail
https://protonmail.com, Swiss-based encrypted email.
-------- Original Message -------- Subject: Re: [Rd]
Cannot Compute Box's M (Three Days Trying...) Local Time:
October 27, 2017 6:09 PM UTC Time: October 27, 2017 10:09
PM From: murdoch.dun...@gmail.com
<mailto:murdoch.dun...@gmail.com> To: Morkus
mor...@protonmail.com <mailto:mor...@protonmail.com>,
r-devel@r-project.org <mailto:r-devel@r-project.org>
r-devel@r-project.org <mailto:r-devel@r-project.org> Just
print the string you are asking to R to evaluate. It
doesn't make any sense as an R expression. Fix that, and
things will work. Duncan Murdoch On 27/10/2017 3:41 PM,
Morkus via R-devel wrote: |It can't be this hard, right? I
really need a shove in the right direction here. Been
spinning wheels for three days. Cannot get past the
errors. I'm doing something wrong, obviously, since I can
easily compute the Box's M right there in RStudio But I
don't see what is wrong below with the coding equivalent.
The entire code snippet is below. The code fails below on
the call to the boxM statistic call. PLEASE HELP!!! Thanks
in advance,
------------------------------------------------------------------------
rConnection.eval("library('biotools')"); String inputIris
= "5.1,3.5,1.4,0.2,setosa\n" + "4.9,3,1.4,0.2,setosa\n" +
"4.7,3.2,1.3,0.2,setosa\n" + "4.6,3.1,1.5,0.2,setosa\n" +
"5,3.6,1.4,0.2,setosa\n" + "5.4,3.9,1.7,0.4,setosa\n" +
"4.6,3.4,1.4,0.3,setosa\n" + "5,3.4,1.5,0.2,setosa\n" +
"4.4,2.9,1.4,0.2,setosa\n" + "4.9,3.1,1.5,0.1,setosa\n" +
"5.4,3.7,1.5,0.2,setosa\n" + "4.8,3.4,1.6,0.2,setosa\n" +
"4.8,3,1.4,0.1,setosa\n" + "4.3,3,1.1,0.1,setosa\n" +
"5.8,4,1.2,0.2,setosa\n" + "5.7,4.4,1.5,0.4,setosa\n" +
"5.4,3.9,1.3,0.4,setosa\n" + "5.1,3.5,1.4,0.3,setosa\n" +
"5.7,3.8,1.7,0.3,setosa\n" + "5.1,3.8,1.5,0.3,setosa\n" +
"5.4,3.4,1.7,0.2,setosa\n" + "5.1,3.7,1.5,0.4,setosa\n" +
"4.6,3.6,1,0.2,setosa\n" + "5.1,3.3,1.7,0.5,setosa\n" +
"4.8,3.4,1.9,0.2,setosa\n" + "5,3,1.6,0.2,setosa\n" +
"5,3.4,1.6,0.4,setosa\n" + "5.2,3.5,1.5,0.2,setosa\n" +
"5.2,3.4,1.4,0.2,setosa\n" + "4.7,3.2,1.6,0.2,setosa\n" +
"4.8,3.1,1.6,0.2,setosa\n" + "5.4,3.4,1.5,0.4,setosa\n" +
"5.2,4.1,1.5,0.1,setosa\n" + "5.5,4.2,1.4,0.2,setosa\n" +
"4.9,3.1,1.5,0.2,setosa\n" + "5,3.2,1.2,0.2,setosa\n" +
"5.5,3.5,1.3,0.2,setosa\n" + "4.9,3.6,1.4,0.1,setosa\n" +
"4.4,3,1.3,0.2,setosa\n" + "5.1,3.4,1.5,0.2,setosa\n" +
"5,3.5,1.3,0.3,setosa\n" + "4.5,2.3,1.3,0.3,setosa\n" +
"4.4,3.2,1.3,0.2,setosa\n" + "5,3.5,1.6,0.6,setosa\n" +
"5.1,3.8,1.9,0.4,setosa\n" + "4.8,3,1.4,0.3,setosa\n" +
"5.1,3.8,1.6,0.2,setosa\n" + "4.6,3.2,1.4,0.2,setosa\n" +
"5.3,3.7,1.5,0.2,setosa\n" + "5,3.3,1.4,0.2,setosa\n" +
"7,3.2,4.7,1.4,versicolor\n" +
"6.4,3.2,4.5,1.5,versicolor\n" +
"6.9,3.1,4.9,1.5,versicolor\n" +
"5.5,2.3,4,1.3,versicolor\n" +
"6.5,2.8,4.6,1.5,versicolor\n" +
"5.7,2.8,4.5,1.3,versicolor\n" +
"6.3,3.3,4.7,1.6,versicolor\n" +
"4.9,2.4,3.3,1,versicolor\n" +
"6.6,2.9,4.6,1.3,versicolor\n" +
"5.2,2.7,3.9,1.4,versicolor\n" + "5,2,3.5,1,versicolor\n"
+ "5.9,3,4.2,1.5,versicolor\n" + "6,2.2,4,1,versicolor\n"
+ "6.1,2.9,4.7,1.4,versicolor\n" +
"5.6,2.9,3.6,1.3,versicolor\n" +
"6.7,3.1,4.4,1.4,versicolor\n" +
"5.6,3,4.5,1.5,versicolor\n" +
"5.8,2.7,4.1,1,versicolor\n" +
"6.2,2.2,4.5,1.5,versicolor\n" +
"5.6,2.5,3.9,1.1,versicolor\n" +
"5.9,3.2,4.8,1.8,versicolor\n" +
"6.1,2.8,4,1.3,versicolor\n" +
"6.3,2.5,4.9,1.5,versicolor\n" +
"6.1,2.8,4.7,1.2,versicolor\n" +
"6.4,2.9,4.3,1.3,versicolor\n" +
"6.6,3,4.4,1.4,versicolor\n" +
"6.8,2.8,4.8,1.4,versicolor\n" +
"6.7,3,5,1.7,versicolor\n" + "6,2.9,4.5,1.5,versicolor\n"
+ "5.7,2.6,3.5,1,versicolor\n" +
"5.5,2.4,3.8,1.1,versicolor\n" +
"5.5,2.4,3.7,1,versicolor\n" +
"5.8,2.7,3.9,1.2,versicolor\n" +
"6,2.7,5.1,1.6,versicolor\n" +
"5.4,3,4.5,1.5,versicolor\n" +
"6,3.4,4.5,1.6,versicolor\n" +
"6.7,3.1,4.7,1.5,versicolor\n" +
"6.3,2.3,4.4,1.3,versicolor\n" +
"5.6,3,4.1,1.3,versicolor\n" +
"5.5,2.5,4,1.3,versicolor\n" +
"5.5,2.6,4.4,1.2,versicolor\n" +
"6.1,3,4.6,1.4,versicolor\n" +
"5.8,2.6,4,1.2,versicolor\n" + "5,2.3,3.3,1,versicolor\n"
+ "5.6,2.7,4.2,1.3,versicolor\n" +
"5.7,3,4.2,1.2,versicolor\n" +
"5.7,2.9,4.2,1.3,versicolor\n" +
"6.2,2.9,4.3,1.3,versicolor\n" +
"5.1,2.5,3,1.1,versicolor\n" +
"5.7,2.8,4.1,1.3,versicolor\n" +
"6.3,3.3,6,2.5,virginica\n" +
"5.8,2.7,5.1,1.9,virginica\n" +
"7.1,3,5.9,2.1,virginica\n" +
"6.3,2.9,5.6,1.8,virginica\n" +
"6.5,3,5.8,2.2,virginica\n" + "7.6,3,6.6,2.1,virginica\n"
+ "4.9,2.5,4.5,1.7,virginica\n" +
"7.3,2.9,6.3,1.8,virginica\n" +
"6.7,2.5,5.8,1.8,virginica\n" +
"7.2,3.6,6.1,2.5,virginica\n" +
"6.5,3.2,5.1,2,virginica\n" +
"6.4,2.7,5.3,1.9,virginica\n" +
"6.8,3,5.5,2.1,virginica\n" + "5.7,2.5,5,2,virginica\n" +
"5.8,2.8,5.1,2.4,virginica\n" +
"6.4,3.2,5.3,2.3,virginica\n" +
"6.5,3,5.5,1.8,virginica\n" +
"7.7,3.8,6.7,2.2,virginica\n" +
"7.7,2.6,6.9,2.3,virginica\n" + "6,2.2,5,1.5,virginica\n"
+ "6.9,3.2,5.7,2.3,virginica\n" +
"5.6,2.8,4.9,2,virginica\n" + "7.7,2.8,6.7,2,virginica\n"
+ "6.3,2.7,4.9,1.8,virginica\n" +
"6.7,3.3,5.7,2.1,virginica\n" +
"7.2,3.2,6,1.8,virginica\n" +
"6.2,2.8,4.8,1.8,virginica\n" +
"6.1,3,4.9,1.8,virginica\n" +
"6.4,2.8,5.6,2.1,virginica\n" +
"7.2,3,5.8,1.6,virginica\n" +
"7.4,2.8,6.1,1.9,virginica\n" +
"7.9,3.8,6.4,2,virginica\n" +
"6.4,2.8,5.6,2.2,virginica\n" +
"6.3,2.8,5.1,1.5,virginica\n" +
"6.1,2.6,5.6,1.4,virginica\n" +
"7.7,3,6.1,2.3,virginica\n" +
"6.3,3.4,5.6,2.4,virginica\n" +
"6.4,3.1,5.5,1.8,virginica\n" + "6,3,4.8,1.8,virginica\n"
+ "6.9,3.1,5.4,2.1,virginica\n" +
"6.7,3.1,5.6,2.4,virginica\n" +
"6.9,3.1,5.1,2.3,virginica\n" +
"5.8,2.7,5.1,1.9,virginica\n" +
"6.8,3.2,5.9,2.3,virginica\n" +
"6.7,3.3,5.7,2.5,virginica\n" +
"6.7,3,5.2,2.3,virginica\n" + "6.3,2.5,5,1.9,virginica\n"
+ "6.5,3,5.2,2,virginica\n" +
"6.2,3.4,5.4,2.3,virginica\n" +
"5.9,3,5.1,1.8,virginica\n"; List tableRead =
rConnection.eval( "read.csv(textConnection("" + inputIris
+ ""), header = FALSE)").asList(); // works! double[] d1 =
((REXPVector) ((RList) tableRead).get(0)).asDoubles();
double[] d2 = ((REXPVector) ((RList)
tableRead).get(1)).asDoubles(); double[] d3 =
((REXPVector) ((RList) tableRead).get(2)).asDoubles();
double[] d4 = ((REXPVector) ((RList)
tableRead).get(3)).asDoubles(); String[] d5 =
((REXPVector) ((RList) tableRead).get(4)).asStrings(); //
create data frame with data.REXP myDf =
REXP.createDataFrame(new RList( new REXP[] { new
REXPDouble(d1), new REXPDouble(d2), new REXPDouble(d3),
new REXPDouble(d4), new REXPString(d5) })); // assign the
data to a variable as was
suggested.rConnection.assign("boxMVariable", myDf); //
create a string command with that variable name.String
boxVariable = "boxM(boxMVariable [,-5], boxMVariable[,5]";
// try to execute the command... // FAILS with
org.rosuda.REngine.Rserve.RserveException: eval failed,
request status: R parser: input incomplete>>>> FAILS !
>>>> REXP theBoxMResult = rConnection.eval(boxVariable);
<<<< FAILS <<<<< sent from ProtonMail
<https://protonmail.com>, Swiss-based encrypted email.
[[alternative HTML version deleted]]
------------------------------------------------------------------------
R-devel@r-project.org <mailto:R-devel@r-project.org>
mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
| | |