R语法问题

时间:2010-09-02 08:49:30

标签: r

我正在尝试使用if - else语句将不同的字符串捕获到不同条件的文件中:

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')         猫(“\ n”)

当我尝试运行代码时,我不断收到如下错误:

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"

我出错的任何想法?这是正确的方法这是否有更好的方法来编写文件?

我正在尝试遵循Spacedman的建议并使用brew。我尝试了不同的差异,我得到以下错误信息:

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

或者如果我开始工作,hovertext在整个过程中保持不变。

目前R代码如下:

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")

关于我在代码中哪里出错的任何想法?

3 个答案:

答案 0 :(得分:2)

}之前没有结束结束括号(else)。

对于嵌套if,您应该使用:

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

此外,您似乎在data.frame语句中引用了if列。如果这有 1,只使用第一个元素。对于矢量化版本,请使用ifelse,但我不确定这会给出您想要的内容,您可能已经编写了一个循环。

答案 1 :(得分:1)

另外,令人讨厌的代码。尝试使用“brew”包(在CRAN上)进行模板化。它使事情变得简单,为模板字符串中的引号节省了大量的反斜杠,并迫使您从模板字符串中取出大块逻辑并进入它所属的应用程序。

例如,你的第一个if-else混乱只决定使用什么hovertext。它会更好:

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

然后将hovertext放入brew模板文件中:

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

另外,您的sprintfs有两个占位符(%-markers)但有三个变量。到底有什么额外的“差异”?使用brew的另一个原因!

答案 2 :(得分:0)

更好地使用XML包将您的数据转换为XML。然而,问题本身已被詹姆斯发现。