【发布时间】:2019-03-01 18:30:38
【问题描述】:
我在 R 中制作了很多频率表,并且正在编写自己的快速频率表 (qft) 函数时遇到了我认为是词法范围问题的问题。这是我的功能版本不起作用
library("tidyverse")
data(mtcars)
qft_bad<-function(data,...){
ft<-data.frame(with(data, table(...)))
ft<-ft[ft$Freq!=0,]
return(ft)
}
tst_bad<-qft_bad(mtcars,cyl,gear)
您会注意到,如果您尝试运行 qft_bad(),则会产生错误“表中的错误 (...) : object 'cyl' not found”。作为一种解决方法,我编写了以下函数,它确实产生了预期的结果,但需要稍微不同的输入。
qft_good<-function(data,...){
nmes<-c(...)
vars<-dplyr::select(data,...)
ft<-data.frame(table(vars))
ft<-ft[ft$Freq!=0,]
colnames(ft)[1:length(nmes)]<-nmes
return(ft)
}
tst_good<-qft_good(mtcars,"cyl","gear")
我猜 qft_bad() 不起作用,因为 R 试图评估输入数据集之外的参数,但我有点不清楚这个问题的细节(是否存在一些问题with() 函数?)。
由于 qft_good() 对我的目的来说足够好,我主要是为了我自己的 R 启蒙而问这个问题。谁能更好地解释我的 qft_bad() 函数中发生了什么,或者创建一个不需要您在引号中列出变量名称的 qft 函数版本(正如您必须在 qft_good())?
【问题讨论】:
标签: r function frequency ellipsis lexical-scope