楼主: 梦孟小宝
4218 11

[问答] R 自编函数中如何指代参数data的参数variable [推广有奖]

11
梦孟小宝 发表于 2017-2-15 09:19:51
zhangyangsmith 发表于 2017-2-14 19:07
你好,我试着运行了以下这个代码,但是发现rm(a,b)后,就无法运行了,提示:Error in eval(expr, envir, enclos) : object 'b' not found。函数好像是把向量a, b 代入运算的。

12
zhangyangsmith 发表于 2017-2-15 17:03:09
梦孟小宝 发表于 2017-2-15 09:19
你好,我试着运行了以下这个代码,但是发现rm(a,b)后,就无法运行了,提示:Error in eval(expr, envir,  ...
I have seen your other post. Indeed my previous script was not correct. Try the following:

  1. recommend2 <- function(data, v1, v2) {
  2.   
  3.   var1 <- eval( eval( substitute( quote(v1) ) ), envir = data )
  4.   
  5.   var2 <- eval( eval( substitute( quote(v2) ) ), envir = data )
  6.   
  7.   #若药物1的治疗有效率大于0.9,则推荐药物1
  8.   if (var2[var1==1]>0.9) {
  9.     r <- 1
  10.   } else if (
  11.   #若药物1与药物2、药物3的治疗有效率差异不大(<20%),则推荐药物1
  12.                   max(abs(var2[var1==1]-var2[var1==2]/
  13.                      max(var2[var1==1],var2[var1==2])),
  14.                     abs(var2[var1==1]-var2[var1==2]/
  15.                     max(var2[var1==1],var2[var1==2]))) <0.2) {
  16.     r <- 1
  17.   } else if (
  18. #若药物1与药物2或药物3的治疗有效率差异大(>20%),则推荐治疗有效率高的药物
  19.             any(c(abs(var2[var1==1]-var2[var1==2]/
  20.                 max(var2[var1==1],var2[var1==2])),
  21.           abs(var2[var1==1]-var2[var1==2]/
  22.           max(var2[var1==1],var2[var1==2]))) >0.2)) {
  23.       r <- var1[which.max(var2)]
  24.   }
  25.   return(r)
  26. }
  27. a <- c(1,2,3)
  28. b <- c(0.6, 0.98, 0.95)
  29. df <- data.frame(a,b)
  30. rm(a, b)
  31. recommend2(df, a, b)
  32. ## [1] 2
复制代码
I am not sure if those complicate (i.e., hard to understand) eval/substitute/quote is absolute necessary here. I personally would design the function "recommend2" such that the 2nd and 3rd argument are simply strings which would make the scripts much more straight forward:

  1. recommend3 <-
  2.     function(data, s1, s2)
  3.     {
  4.         var1 <- data[, s1]
  5.         var2 <- data[, s2]
  6.         # ...
  7.     }
复制代码



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 10:06