2010-09-14 30 views
2

我有以下R函數檢查一系列值並寫出關於它們的句子。問題是,當我使用函數,然後調用它的所有句子都是相同的,不管值是多少。使用if語句的函數只返回一個其他條件而不管值

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

希望這有助於。

+0

沒有什麼進入你的功能?至少應該爲你的函數指定一個參數。如果你提供一些樣本數據,這將是很好的。 – 2010-09-14 08:13:10

回答

6

有很多問題是:

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 
+0

@Richie thx,我錯過了那個錯字。 – 2010-09-14 11:15:57

相關問題