首页 > 解决方案 > 代码在函数外部执行,但不在函数内部执行

问题描述

我的问题是,一些代码在函数之外执行,但不在其中。在我的示例中,某些单元格的内容应该从输入表传输到输出表。在删除或添加行/列的情况下,我不会通过它们的索引(例如 input[3,4])访问单元格,而是通过应用条件(例如 input[(which(input$code=="A1 ")),(其中(colnames(input)=="kg"))]。

所以这是我的数据的最小化版本:

input<-data.frame(animal=c("cat","dog","mouse","deer","lion"),
                  m=c(0.5,1,0.1,1.5,3),
                  kg=c(5,20,0.2,50,100),
                  code=c("A4","A5","A3","A1","A2"))
output<-data.frame(code=c("A1","A2","A3","A4","A5"),
                  kg=numeric(5))

在函数外部执行,有效(输入表单元格的内容应复制到输出表中的合适单元格):

row_out<-which(output$code=="A1")
col_out<-which(colnames(output)=="kg")
row_in<-which(input$code=="A1")
col_in<-which(colnames(input)=="kg")

output[row_out,col_out]<-input[row_in,col_in]

和包含相同代码的函数,除了用引用的代码表达式替换函数参数(代码表达式)之外,它在外部工作:

fun_transfer<-function(codeexpression){
  row_out<-which(output$code==codeexpression)
  col_out<-which(colnames(output)=="kg")
  row_in<-which(input$code==codeexpression)
  col_in<-which(colnames(input)=="kg")
  output[row_out,col_out]<-input[row_in,col_in]
}

问题:现在执行

fun_transfer("A4")

不会导致错误,也不会导致输出表中的结果。

为什么这个功能不起作用,或者更确切地说它是做什么的?引号有问题吗?任何帮助将不胜感激,米歇尔

标签: rfunctionrelationalquotation-marks

解决方案


在最好的情况下,数据作为参数进入函数并将其作为返回值。

在函数之外

output[row_out,col_out] <- input[row_in,col_in]

更改现有的data.frame。您可以(或更好:应该)不要从函数内部更改函数外部的某些变量。

只需使用return语句结束您的函数即可将更改的数据帧返回给调用者

编辑

看起来您尝试编写的是较小版本的merge. 如果以下内容回答了您的问题,它可能会更简洁、更快、更惯用:

input<-data.frame(animal=c("cat","dog","mouse","deer","lion"),
                  m=c(0.5,1,0.1,1.5,3),
                  kg=c(5,20,0.2,50,100),
                  code=c("A4","A5","A3","A1","A2"))
output<-data.frame(code=c("A1","A2","A3","A4","A5"))


output <- merge(output, input[, c("code", "kg")], by = "code", 
                all.x = TRUE, all.y = FALSE)
print(output)

推荐阅读