【问题标题】:Function using If statement does not get executed使用 If 语句的函数未执行
【发布时间】:2016-06-04 18:34:35
【问题描述】:

我正在使用来自 R 的包 dplyr。我阅读了教科书和在线文章,但我无法弄清楚为什么这个功能不起作用。有人可以指出如何修复我的功能吗?

##creating dataset - this dataset is ranked by group (ID)
dt <- data.frame(
    ID = c('A1','A2','A4','A2','A1','A4','A3','A2','A1','A3'),
    Value = c(4,3,1,3,4,6,6,1,8,4));
dt2<-transform(dt, order.by.group = 
    ave(Value, ID, FUN = function(x) rank(x, ties.method = "first")))


##This function does not work, but it's supposed to create dt3 which is based
##on condition such as "best","worst" ranking etc in each ID group

test<- function(num="best") {
    if (num=="best") {
        dt3<-filter(dt2,order.by.group==1)}
    else if (num=="worst") {
        #sort to make low rank come to the last row position
        dt2<-arrange(dt2,ID,order.by.group)
        # Select the last row by id
        dt3<-dt2[!duplicated(dt2$ID, fromLast=TRUE), ]}
    else {dt3<-filter(dt2,order.by.group==num)}
}

【问题讨论】:

  • @MatthewLundberg 我不认为“=”有效。我收到错误消息说错误:过滤条件不评估为逻辑向量。
  • @ZheyuanLi 我检查了 ?filter 和示例用法。我看到“过滤器(mtcars,cyl == 8)”所以我认为它是这样使用的。我错过了什么吗?
  • @ZheyuanLi 我正在使用 R 的 dplyr 包。我还清除了我的工作空间,但我没有收到您的错误消息。我真的什么都没有得到,也没有执行。让我重新启动 R 并再次运行代码。
  • @ZheyuanLi 哦好的。当我运行 test("best") 或 test(2) 时,它不会产生 dt3,我也没有收到任何错误消息

标签: r function if-statement dplyr


【解决方案1】:

现在呢?

test<- function(num="best") {
  if (num=="best") {
    dt3<-filter(dt2,order.by.group==1)
    } else if (num=="worst") {
    #sort to make low rank come to the last row position
    dt2<-arrange(dt2,ID,order.by.group)
    # Select the last row by id
    dt3<-dt2[!duplicated(dt2$ID, fromLast=TRUE), ]
    } else {
    dt3<-filter(dt2,order.by.group==num)
    }
 return(dt3)
 }

您的函数似乎缺少return 声明。


更新:

哦,这解决了我的问题。但我仍然想知道为什么对象dt3 没有出现在全局环境中。我的意思是当我在控制台中输入dt2 时,它会在那里显示结果,但是当我输入dt3 时,它会显示“错误:找不到对象'dt3'”

调用函数时,请执行dt3 &lt;- test()。函数内部的dt3 是一个局部变量;它在函数退出时被销毁。但是,通过显式赋值:dt3 &lt;-,会在全局环境中创建一个变量dt3,接受函数的返回值。

变量的作用域不仅适用于 R,也适用于所有编程语言。

【讨论】:

  • 哦,这解决了我的问题。谢谢!但我仍然想知道为什么对象 dt3 没有出现在全球环境中。我的意思是当我在控制台中输入“dt2”时,它会在那里显示结果,但是当我输入“dt3”时,它会显示“错误:找不到对象'dt3'”
  • 感谢您的解释!现在很清楚了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多