Функция, использующая оператор if, возвращающая только одно условие независимо от значения - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть следующая функция R, которая проверяет диапазон значений и записывает предложение о них. Проблема в том, что когда я использую функцию и затем вызываю ее, все предложения одинаковы, независимо от значения.

hover <- function (){
if(df$Value > 140 && df$Change < -0.05){
hovertext ="Price High, Level of Activity Low"
}else{
   if(df$Value < 140 && df$Change > 90 && df$YVoltage > -0.05 &&
      df$YVoltage < 0.30 ){
    hovertext ="Price Normal, Level of Activity normal"
      } else {
hovertext ="Price High, Level of Activity high"
      }
  }
}
hovertext <- hover ()
hovertext

Любые идеи относительно того, как решить эту проблему.

Вот пример данных:

TimeStamp,Price,Change
12:00:00,140,0.05
12:12:03,148,0.06
12:12:40,130,-0.05
12:12:50,135,0.01
12:13:00,135,0
12:13:10,1.37,0.01

Вот что у меня есть на данный момент:

library (ggplot2)
df <- read.csv(file.choose(), header =TRUE) 
df
df$Price <- as.numeric(as.character(df$Price))
df$Change <- as.numeric(as.character(df$Change))
df$TimeStamp <- strptime(as.character(df$TimeStamp), "%H:%M:%OS")
sapply(df, class)          
options("digits.secs"=3)   
summary (df)              
df$TimeStamp <- df[1,"TimeStamp"] +
  cumsum(runif(1:length(df$TimeStamp))*60)
summary(df)
hover <- function (df){ 
    out <- ifelse((df$Value > 140 & df$Change < -0.05), 
              "Price High, Level of Activity Low", 
    ifelse((df$Value < 140 & df$Change > 90 && 
          df$YVoltage > -0.05 & df$Change < 0.30), 
              "Price Normal, Level of Activity normal", 
              "Price High, Level of Activity high" 
          )) 
    return(out) 
} 
hovertext <- hover(df) 
hovertext 

sink (file="c:/Users/user/text.txt", type="output",split=FALSE)
cat(sprintf("    Time=\"%s\" value=\"%f\" hoverText =\" %s\" ></set>\n",
            df$TimeStamp, df$Price, hovertext))
unlink("text.txt")

Надеюсь, это поможет.

1 Ответ

6 голосов
/ 14 сентября 2010

С этим много проблем:

1) вы используете функцию без аргументов и надеетесь, что она что-то сделает с переменными в вашей глобальной среде.Это опасно

2) функция ничего не возвращает.На самом деле это так: он возвращает последнее назначение, но я уверен, что вы этого не знаете, поэтому в любом случае лучше всегда включать предложение return().

3) предложение if()не векторизован, поэтому он использует только первое условие.В вашем случае он проверяет только первую строку df.

5) && и || используются, если вы хотите проверить только первое значение серии.Здесь вам нужны & и | (см. ?"&" в R)

5) Не вызывайте ваш фрейм данных df, df() - функция.Чтобы сделать то, что, я думаю, вы хотите сделать, попробуйте это:

#Sample data for testing
Df <- data.frame(Value = rnorm(100,140,10),
Change = rnorm(100,90,90),
YVoltage = rnorm(100,0.10,0.30))

hover <- function (X){
    out <- ifelse((X$Value > 140 & X$Change < -0.05),
              "Price High, Level of Activity Low",
    ifelse((X$Value < 140 & X$Change > 90 &
          X$YVoltage > -0.05 & X$YVoltage < 0.30),
              "Price Normal, Level of Activity normal",
              "Price High, Level of Activity high"
          ))
    return(out)
}

hovertext <- hover(Df)
hovertext
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...