将功能输出保存到数据框r中的向量或列

时间:2018-08-11 14:49:05

标签: r function output

我正在尝试在R中编写一个函数 1)遍历我的数据框中的一列,2)将该列和另一列的内容打印到屏幕上,3)接受可接受内容的用户输入,4)保留第1列或第2列的内容(如果用户决定是正确的)或将用户的更正输入保存到新列中。

此任务的最后一步是我的函数卡住并且不产生任何输出。我正在调用的输出列已存在于数据框中,但只是没有将值分配给它。如果我要为要创建的新列指定一个新列名,那么这也不起作用,我也想不起来为什么。

我尝试将用户输入分配给向量(blabla),以尝试调试代码,但即使这样也没有用(不管在调用函数之前是否创建了该输出对象,但理想情况下,输出对象应该是在函数内部创建)。当我使用特定的列单独运行for循环时,它运行得很顺利,所以我不知道为什么它不能在更通用的功能中使用。我没看到什么?我试图将输出分配给变量似乎是一个问题,因为在循环的最后一步将其打印到控制台可以正常工作,这意味着步骤3中的用户输入确实得到了正确处理。

我的函数编写技能还不是很出色,所以我愿意就如何使它变得更加优雅提出建议。显然,我可以单独使用for循环来解决问题,因为它可以正常工作,但是我想学习如何使函数执行该操作。

Check_Content <- function(data, contentcol1, contentcol2, outputcol) {

  #create output column:
  data[[outputcol]] <- c()

  for (i in 1:length(data[[contentcol1]])) {

  #show content of columns that are to be checked:
  print(c(data[[contentcol1]][i], data[[contentcol2]][i]))

  #request userinput:
  userinput <- readline("Type '1' for col1, '2' for col2 or correction: ")

     #keep content from col 1 or 3 or new content
     if (userinput == "1"){
     output <- data[[contentcol1]][i]
     } else if (userinput == "2"){
     output <- data[[contentcol2]][i]
     } else {
     output <- userinput
     }

  #save output in multiple ways but none of them works except print:
  data[[outputcol]][i] <- output   #this works if the for loop is run on its own
  data[[outputcol]][i] <- rbind(output)  #this works if the for loop is run on its own
  blabla[i] <- rbind(output)  
  print(output)
  }
}

1 个答案:

答案 0 :(得分:0)

您不需要将输出列放入函数的参数列表中。最好修改您的输入参数,例如它可能只是contentcol1,contentcol2。如果它是来自一个数据库的列,则在调用函数时,您必须以自己喜欢的方式进行指定,例如data $ contentcol1

  Check_Content <- function(contentcol1, contentcol2) {

    #create output column:
    outputcol <- c()

    for (i in 1:length(contentcol1)) {

      #show content of columns that are to be checked:
      print(c(contentcol1[i], contentcol2[i]))

      #request userinput:
      userinput <- readline("Type '1' for col1, '2' for col2 or correction: ")

      #keep content from col 1 or 3 or new content
      outputcol[i] <- ifelse (userinput == "1", contentcol1[i], ifelse(userinput == "2",contentcol2[i], userinput))
      }
    return(outputcol)
  }

  contentcol1 <- c(1,2,1,1,1,2,2,2,1)
  contentcol2 <- c(1,1,2,1,1,1,2,2,2)

 p <- Check_Content(contentcol1, contentcol2)