我有以下R函数,它检查一系列值并写出一个关于它们的句子.问题是,当我使用该函数然后调用它时,无论Value如何,所有句子都是相同的.
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
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何想法.
以下是示例数据:
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
Run Code Online (Sandbox Code Playgroud)
这就是我目前所拥有的:
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")
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
这有很多问题:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20332 次 |
| 最近记录: |