楼主: shang00122
4278 9

[问答] R function(i) i能是字符串吗? [推广有奖]

  • 6关注
  • 3粉丝

已卖:1份资源

副教授

40%

还不是VIP/贵宾

-

威望
0
论坛币
2518 个
通用积分
40.0287
学术水平
3 点
热心指数
6 点
信用等级
2 点
经验
10231 点
帖子
572
精华
0
在线时间
425 小时
注册时间
2009-2-1
最后登录
2025-2-22

楼主
shang00122 在职认证  发表于 2016-5-23 14:44:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请教大家,就是 R function(i) i能是字符串吗?
比如:
fucntion(i){
     table(mydata $ i )
}
如果想使用字符串的话,应该怎么用呢?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:function Fun CTI TIO UNC function 字符串

本帖被以下文库推荐

沙发
万人往LVR 在职认证  发表于 2016-5-23 16:11:37
fucntion(i){
     table(mydata[,i])
}
已有 1 人评分学术水平 热心指数 收起 理由
cheetahfly + 3 + 3 热心帮助其他会员

总评分: 学术水平 + 3  热心指数 + 3   查看全部评分

藤椅
shang00122 在职认证  发表于 2016-5-23 19:19:18
多谢啦!

板凳
jiangbeilu 学生认证  发表于 2016-5-23 22:41:59
这个问题,如果直接用美元符号后面加字符串,是不行的,
楼上提出的方法,是变成了数字列,所以可以直接引用
但是如果数据比较多,然后你又不知道是哪一列的时候,局限就体现出来了。
提供两种解决问题的方法:
  1. # method 1
  2. myfun <- function(x,y){
  3. table(with(x,eval(parse(text=y))))
  4. }
  5. myfun(airquality,"Month")
  6. # method 2
  7. myfun2 <- function(x,y){
  8. mydata <- deparse(substitute(x))
  9. # 把x变成字符
  10. table(eval(parse(text=paste(mydata,"$",y,sep=""))))
  11. }

  12. myfun(airquality,"Month")
  13. myfun2(airquality,"Month")
复制代码
已有 1 人评分学术水平 收起 理由
万人往LVR + 3 精彩帖子

总评分: 学术水平 + 3   查看全部评分

报纸
shang00122 在职认证  发表于 2016-5-24 09:17:15
谢谢,多谢指点,高手如云啊!

地板
万人往LVR 在职认证  发表于 2016-5-24 09:47:13
jiangbeilu 发表于 2016-5-23 22:41
这个问题,如果直接用美元符号后面加字符串,是不行的,
楼上提出的方法,是变成了数字列,所以可以直接引 ...
谢谢,我回复的i其实就是字符串,同with函数

可以解释一下deparse(substitute(x))里面两个函数的含义吗?

我看到deparse函数的意义是:Turn unevaluated expressions into character strings.
什么是evaluated和unevaluated?

多谢!

7
cheetahfly 在职认证  发表于 2016-5-24 11:00:02
“万人往LVR”同学的函数在引用"character"的实参时,是没有问题的。比如:
  1. # 函数定义
  2. fun <- function(df, i) {
  3.     table(df[, i])
  4. }
  5. # 函数效果检验
  6. > fun(airquality, "Month")
  7. 5  6  7  8  9
  8. 31 30 31 31 30
  9. > fun(airquality, 5L)
  10. 5  6  7  8  9
  11. 31 30 31 31 30
  12. > fun(airquality, 5.9)
  13. 5  6  7  8  9
  14. 31 30 31 31 30
复制代码
可以看到,当‘i’的实参value为"character"、"integer"、"numeric"等类型的值时,都是可以正常引用的。不过注意,当是"numeric"时,实际引用的列数是‘i’的value被truncated后的值,并非四舍五入后的值。

“jiangbeilu”同学用到了substitute()和deparse()函数,是涉及了R语言很牛逼的一个特性,即:R has powerful tools for computing not only on values, but also on the actions that lead to those values.——by Hadley Wickham。上面这个特点能够在我们这个实际案例中发挥什么作用呢?至少其中一条,可以让‘i’的实参不加引号,就可以正常使用,也就是说,fun(airquality, Month)和fun(airquality, "Month")都能正常运行,就像library(ggplot2)和library("ggplot2")都正确一样。
  1. # 函数定义
  2. fun2 <- function(df, i) {
  3.   i <- as.character(substitute(i))
  4.   return(table(df[, i]))
  5. }
  6. # 函数效果检验
  7. > identical(fun2(airquality, "Month"), fun2(airquality, Month))
  8. [1] TRUE
复制代码
当然,这个函数没有什么用,纯粹是为了举个例子,因为,它不能处理 i 为5、5.5、5L时的情况,而且如果 i 的值是个向量,也无法正确引用,要完善这个函数稍微复杂一点,我就引用Hadley Wickham的示范代码如下:
  1. # 函数定义
  2. fun3 <- function(df, i) {
  3.     i <- substitute(i)
  4.     i_pos <- setNames(as.list(seq_along(df)), names(df))
  5.     pos <- eval(i, i_pos)
  6.     table(df[, pos, drop = FALSE])
  7. }
  8. # 函数效果检验
  9. > fun3(airquality, Month)
  10. 5  6  7  8  9
  11. 31 30 31 31 30
  12. > fun3(airquality, "Month")
  13. 5  6  7  8  9
  14. 31 30 31 31 30
  15. > fun3(airquality, 5L)
  16. 5  6  7  8  9
  17. 31 30 31 31 30
  18. > fun3(airquality, 4:5)
  19.     Month
  20. Temp 5 6 7 8 9
  21.   56 1 0 0 0 0
  22.   57 3 0 0 0 0
  23.   58 2 0 0 0 0
  24.   59 2 0 0 0 0
  25. # ......
  26. # 结果省略大部分
复制代码
就实用性而言,“万人往LVR”同学的函数就简洁够用了。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
shang00122 + 5 + 3 + 3 + 3 精彩帖子
jiangbeilu + 20 + 5 精彩帖子

总评分: 论坛币 + 25  学术水平 + 8  热心指数 + 3  信用等级 + 3   查看全部评分

8
cheetahfly 在职认证  发表于 2016-5-24 11:03:29
万人往LVR 发表于 2016-5-24 09:47
谢谢,我回复的i其实就是字符串,同with函数

可以解释一下deparse(substitute(x))里面两个函数的含义吗 ...
再次向你推荐《advanced R》,第13章《Non-standard evaluation》详细解释了内中的原理和相关函数。
已有 1 人评分学术水平 热心指数 收起 理由
万人往LVR + 3 + 3 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3   查看全部评分

9
马甲1号 发表于 2016-5-24 13:10:26
  1. function(i) eval(parse(text=sprintf('table(mydata$%s)',i)))
复制代码

10
万人往LVR 在职认证  发表于 2016-5-24 14:46:07
cheetahfly 发表于 2016-5-24 11:03
再次向你推荐《advanced R》,第13章《Non-standard evaluation》详细解释了内中的原理和相关函数。
多谢!

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

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