开发者

R Syntax Problem [duplicate]

开发者 https://www.devze.com 2023-01-13 22:48 出处:网络
This question already has answers here: Error: unexpected symbol/input/string constant/numeric constant/SPECIAL in my code
This question already has answers here: Error: unexpected symbol/input/string constant/numeric constant/SPECIAL in my code (3 answers) Closed 8 years ago.

I am having trying to cat different strings to a file for different conditions using if - else statements:

cat("<graph caption=\"ECG Data Wave\" subcaption=\"For Person's Name\"  xAxisName=\"Time\" yAxisMinValue=\"-0.025\" yAxisName=\"Voltage\" decimalPrecision=\"5\"  formatNumberScale=\"0\" numberPrefix=\"\" showNames=\"1\" showValues=\"0\"  showAlternateHGridColor=\"1\" AlternateHGridColor=\"ff5904\" divLineColor=\"ff5904\"  divLineAlpha=\"20\" alternateHGridAlpha=\"5\">\n")
    if (df$BP 开发者_运维技巧> 140 && df$Yvoltage < -0.05){  
    cat(sprintf("    <set name=\"%s\" value=\"%f\" hoverText = \"Blood Pressure High, Level of Activity Low\" ></set>\n", df$XTimeStamp, df$YVoltage, diff))else
        if (df$BP > 140 && df$Yvoltage > -0.05) 
            cat(sprintf("    <set name=\"%s\" value=\"%f\" hoverText = \"Blood Pressure Normal, Level of Activity Normal\" ></set>\n", df$XTimeStamp, df$YVoltage, diff)) else
                 if (df$BP > 140 && df$Yvoltage > -0.35)
                    cat(sprintf("    <set name=\"%s\" value=\"%f\" hoverText = \"Blood Pressure High, Level of Activity High\" ></set>\n", df$XTimeStamp, df$YVoltage, diff))}
    cat(' <trendlines>
       <line startvalue="0.30" displayValue="High Activity" color="FF0000" thickness="1" isTrendZone="0"></line>
       <line startvalue="-0.05" displayValue="Low Activity" color="009999" thickness="1"   isTrendZone="0"></line>

\n') cat ("\n")

When I try to run the code I keep getting an error as follows:

Error: unexpected 'else' in:
"if (df$BP > 140 && df$Yvoltage < -0.05){  
 cat(sprintf("    <set name=\"%s\" value=\"%f\" hoverText = \"Blood Pressure High, Level of Activity Low\" ></set>\n", df$XTimeStamp, df$YVoltage, diff))else"

Any ideas where I am going wrong? Is this the right way do this are is there a better way to write the file?

I am trying to follow Spacedman's advice and use brew. I have tried different variances of it and I either get the following error message:

Error: unexpected input in "cat (sprintf("    <set name=\"%s\" value=\"%f\" hoverText = "<%= hovertext =>" ></set>\n", df$XTimeStamp, df$YVoltage))"

or if I get it working the hovertext remains the same the whole way down.

Currently the R code is as follows:

if(df$BP > 140 && df$YVoltage < -0.05){
    hovertext ="Blood Pressure High, Level of Activity Low"
}else{
   if(df$BP < 140 && df$BP > 90 && df$YVoltage > -0.05 && df$YVoltage < 0.30 ){
    hovertext ="Blood Pressure normal, Level of Activity normal"
      } else {
    hovertext ="Blood Pressure High, Level of Activity high"
       }

sink (file="c:/Users/usr/Desktop/data.xml", type="output",split=FALSE)
cat("<graph caption=\"ECG Data Wave\" subcaption=\"For Person's Name\" xAxisName=\"Time\" yAxisMinValue=\"-0.025\" yAxisName=\"Voltage\" decimalPrecision=\"5\" formatNumberScale=\"0\" numberPrefix=\"\" showNames=\"1\" showValues=\"0\" showAlternateHGridColor=\"1\" AlternateHGridColor=\"ff5904\" divLineColor=\"ff5904\" divLineAlpha=\"20\" alternateHGridAlpha=\"5\">\n")
cat(sprintf("    <set name=\"%s\" value=\"%f\" hoverText = "<%= hovertext =>" ></set>\n", df$XTimeStamp, df$YVoltage))
cat(' <trendlines>   
    <line startvalue="0.30" displayValue="High Activity" color="FF0000" thickness="1" isTrendZone="0"></line>
   <line startvalue="-0.05" displayValue="Low Activity" color="009999" thickness="1" isTrendZone="0"></line>
</trendlines>\n')
cat ("</graph>\n")
unlink("data.xml")

Any ideas on where I am still going wrong in the code?


No closing end bracket (}) before the else.

For nested if, you should use:

if (test) {statement} else {if (test) {statement} else {...}}

Also, you seem to be referencing a data.frame column in your if statement. If this has nrow > 1, only the first element will be used. For a vectorised version, use ifelse, but I'm not sure this would give exactly what you want, you may have write a loop.


Also, yucky code. Try using the "brew" package (on CRAN) for templating. It keeps things simple, saves you a zillion backslashes for quotes in your template strings, and forces you to take large chunks of logic out of template strings and into your application which is where it belongs.

For example, your first if-else mess just decides what hovertext to use. It would be better as:

if(foo){
  hovertext = "first hover text"
}else{
   if(foobar){
      hovertext = "second hovertext"
   } else {
     hovertext = "third hovertext"
   }
}

Then put hovertext in your brew template file:

...
<set name="<%= df$XTimeStamp %>" value="<%= df$YVoltage=>" hoverText = "<%= hovertext =>" ></set>
...

Also also, your sprintfs have two placeholders (%-markers) but three variables. What's the extra 'diff' on the end for? Another reason to use brew!


Better use XML package to convert your data to XML. Yet the problem itself has been spotted by James.

0

精彩评论

暂无评论...
验证码 换一张
取 消