r - 代码在函数外部执行,但不在函数内部执行
问题描述
我的问题是,一些代码在函数之外执行,但不在其中。在我的示例中,某些单元格的内容应该从输入表传输到输出表。在删除或添加行/列的情况下,我不会通过它们的索引(例如 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")
不会导致错误,也不会导致输出表中的结果。
为什么这个功能不起作用,或者更确切地说它是做什么的?引号有问题吗?任何帮助将不胜感激,米歇尔
解决方案
在最好的情况下,数据作为参数进入函数并将其作为返回值。
在函数之外
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)
推荐阅读
- docker - UWSGI 响应时间导致 504 网关超时
- swift - 斯威夫特 | macOS | 检索当前播放音乐的曲目标题和艺术家
- algorithm - Go:用于字符串比较的多项式指纹
- lua - Roblox Studio 错误:ServerScriptService.Script:15:尝试使用“CharacterAdded”索引 nil
- python - 如何在熊猫中绘制类似“眼图”的图?
- php - 使用来自 php 的“无”身份验证屏幕的 Google Drive API
- google-apps-script - Google 脚本编辑器 - 清除单元格(带有公式的除外)
- c - 用C读入文件,将内容放入缓冲区,而不是在缓冲区中获取大小写
- javascript - Nodejs 路由不指向 Angular App 的所有内部路由
- google-chrome - 您的密码可能已泄露 Chrome 弹出窗口