【问题标题】:Save function output to vector or column in data frame r将函数输出保存到数据框 r 中的向量或列
【发布时间】:2018-08-11 14:49:05
【问题描述】:

我正在尝试在 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)
  }
}

【问题讨论】:

    标签: r function output


    【解决方案1】:

    您不需要将输出列放入函数的参数列表中。最好修改您的输入参数,例如它可能只是 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2019-04-09
      • 2021-01-05
      • 2013-04-14
      • 2019-12-08
      • 2014-06-16
      相关资源
      最近更新 更多