如何解决输出中的不一致问题并中断R程序中函数的执行?

时间:2015-06-21 06:57:08

标签: r

编程语言:R x64 3.2.0

披露:这是Coursera提供的R Programming课程中的问题的一部分。我是编程语言的新手,并编写了以下代码作为任务的一部分:

根据给出的数据集中提供的信息,在这项任务中,我们必须找到30天死亡率最低的医院。

输入:状态名称(即数据集中提供的首字母缩写词)和"结果",这是疾病的名称(心脏病发作,心脏病)失败和肺炎)

输出:30天死亡率最低的医院名称(以.csv文件形式提供)

check <- function(state, outcome, data)
{


    disease <- c("heart attack", "heart failure", "pneumonia")
      if(is.element(state, data$State) != TRUE)


{
    print("Invalid State")

  }

  else if(is.element(outcome, disease) != TRUE)
  {
    print("Invalid outcome")


  }

}


best <- function(state, outcome)
{
    dataset <- read.csv("outcome-of-care-measures.csv", colClasses = "character")

  check(state, outcome, dataset)
  if(outcome == 'heart attack')
  {

    temp <- dataset[dataset$State == state, c(2, 11)]
    temp2 <- as.numeric(temp[[2]])
    minimum <- min(temp2, na.rm = TRUE)
    good_hospital <- temp[temp[[2]]== as.character(minimum), 1]

    good_hospital
  }
  else if(outcome == 'heart failure')
  {
    temp <- dataset[dataset$State == state, c(2, 17)]
    temp2 <- as.numeric(temp[[2]])
    minimum <- min(temp2, na.rm = TRUE)
    good_hospital <- temp[temp[[2]]== as.character(minimum), 1]

    good_hospital
  }
  else if(outcome == 'pneumonia')
    {
      temp <- dataset[dataset$State == state, c(2, 23)]
      temp2 <- as.numeric(temp[[2]])
      minimum <- min(temp2, na.rm = TRUE)
      good_hospital <- temp[temp[[2]]== as.character(minimum), 1]

      good_hospital
    }

}
  1. 当我提供最佳输入时(&#34; MD&#34;,&#34;心脏病发作&#34;),它会给我所需的输出,即&#34; JOHNS HOPKINS HOSPITAL,THE& #34;,但是当我给出最好的(&#34; AZ&#34;,&#34;心脏病发作&#34;)时,它给出了字符(0)。事实上,它也是最好的(&#34; TX&#34;,&#34;心脏病发作&#34;)。我不明白我哪里出错了。 (PS:我还没有完成这个程序。我还没有为那些存在平局的情况包含代码。但对于&#34; AZ&#34;和&#34; TX&#34;与&#34; ;心脏病发作&#34;,没有平局。我检查了数据集。)

  2. 如何中断函数执行?我想停止执行函数check()并在满足其中一个案例后停止执行程序。

  3. 提前致谢。 Dropbox链接到数据: https://www.dropbox.com/s/e7qysq8ns5sof27/ProgAssignment3-data.zip?dl=0

1 个答案:

答案 0 :(得分:1)

有两项改进代码的建议:

1。您实际上并不需要单独的检查 -function。您可以将最佳功能中的check(state, outcome, dataset)行替换为:

if(! state %in% dataset$State) stop("invalid state")
if(! outcome %in% c("heart attack", "heart failure", "pneumonia")) stop("invalid outcome")

当在函数中输入无效值时,这两行将停止执行该函数。

2. 您可以按如下方式简化if-else语句中的代码:

if(outcome == 'heart attack')
{
  temp <- dataset[dataset$State == state, c(2, 11)]
  temp <- temp[order(temp[,2],temp[,1]),]
  return(as.character(temp[1,1]))
}

这部分首先获取所需的列,然后根据结果(例如心脏病发作)对其进行排序,并按字母顺序排列。最后一行返回最佳医院的名称。

新的 best -function给出了以下结果:

> best("TX", "heart attack")
[1] "CYPRESS FAIRBANKS MEDICAL CENTER"
> best("AZ", "heart attack")
[1] "MAYO CLINIC HOSPITAL"
> best("MD", "heart attack")
[1] "JOHNS HOPKINS HOSPITAL, THE"