'do.call()`是函数还是直接在R中调用函数?
这是我的密码:'do.call()`是函数还是直接在R中调用函数?,r,do.call,R,Do.call,这是我的密码: >ipo_num_year<- do.call(length,list(as.name(paste0("all_data_align_",year)))) >ipo_num_year >90 >ipo_num_year<- length(as.name(paste0("all_data_align_",year))) >ipo_num_year >1 >首次公开募股数量年首次公开募股数量年 >90 >首次公开募股数量年首次公开募股
>ipo_num_year<- do.call(length,list(as.name(paste0("all_data_align_",year))))
>ipo_num_year
>90
>ipo_num_year<- length(as.name(paste0("all_data_align_",year)))
>ipo_num_year
>1
>首次公开募股数量年首次公开募股数量年
>90
>首次公开募股数量年首次公开募股数量年
>1
year
是字符串对象“1999”
在前面的代码中,所有的数据对齐\u 1999
被分配为一个包含90
元素的列表,因此正确的结果是ipo\u num\u year
等于90
。但是第二行使ipo\u year
等于1
,这意味着length()
函数将的返回值看作.name()
作为符号
对象,因此其长度仅为1
为什么as.name()
的返回值不能直接用作函数length()
的参数?
为什么第一种解决方案效果很好
有人可能会问,为什么不直接使用length(all\u data\u align\u 1999)
。这是因为年份在我的代码中是一个循环变量
非常感谢您的友好回复 您应该使用get
,而不是as.name
:
length(get(paste0("all_data_align_",year)))
您需要检索对象,而不仅仅是名称。谢谢您的回答,这是因为list()在第一个解决方案中尝试将对象作为其元素时会检索对象吗?do.call
函数计算参数,因此它对列表的每个元素使用一种get
函数,因此,在调用length
函数之前,将名称替换为其值。为了避免评估,您应该使用quote=TRUE
参数!回答得好!谢谢你的帮助!为什么您的工作区中有一堆所有数据\u align.*
变量?把它们都列在一个列表中,一切都会变得简单。谢谢你的建议@Roland。我正准备照你说的做。