我正在尝试为R编写一个包,我打算在excel中做这个,但我想学习如何制作一个基本的包会很有趣,并且有很好的知识。
我已经使该函数工作,但是每个变量必须作为一个列单独引用数据集,例如。 DATA $ D1等我想知道如何使它更干净,所以函数有数据有自己的参数,这样数据集的名称只需要给出一次。以同样的方式说aov {stats}包工作,列出列并设置数据框。 AOV示例(Val,Location是数据集starling的列):
aov(Val~Location, data=starlings)
我的功能:
#' Run PCQ Density Calculation
#' Take four distance measurements and specified area and estimate density.
#' @param A = Specified Area (i.e. 1m^2 or 1 hectare (10,000 m^2))
#' @param D1 = Quarter 1 Distance
#' @param D2 = Quarter 2 Distance
#' @param D3 = Quarter 3 Distance
#' @param D4 = Quarter 4 Distance
#' @return The density esitmation
#' @export
PCQ <- function(A,D1,D2,D3,D4){
return(A^2/((D1+D2+D3+D4)/4)^2)
}
我正在使用的功能(D1,D2,D3,D4是数据集dat的列):
PCQ(1,dat$D1,dat$D2,dat$D3,dat$D4)
我试过让函数有一个变量“D”,它将保存数据集的名称,然后在函数中有$ D1等但是没有用。
PCQ <- function(D,A,D1,D2,D3,D4){
return(A^2/((D$D1+D$D2+D$D3+D$D4)/4)^2)
}
很抱歉第一次修改时不够清晰。
答案 0 :(得分:1)
或试试这个
dat <- data.frame(P.1st = 1:10)
PCQ <- function(df, var1) {
col <- deparse(substitute(var1))
return(cumsum(df[, col]))
}
PCQ(dat, P.1st)
# [1] 1 3 6 10 15 21 28 36 45 55
答案 1 :(得分:0)
试试这个
PCQ <- function(data,A,D1,D2,D3,D4){
return(A^2/((data[,D1] + data[,D2] + data[,D3] + data[,D4])/4)^2)
}
此功能可用作
PCQ(data = dat,1,"P.1st","P.2nd","P.3rd","P.4th")
答案 2 :(得分:0)
要将多个列名称传递给函数而不引用它们,我们可以使用包lazyeval
dat <- as.data.frame(matrix(1:50, ncol = 10, dimnames = list(NULL, paste0("C", 1:10))))
# C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
# 1 1 6 11 16 21 26 31 36 41 46
# 2 2 7 12 17 22 27 32 37 42 47
# 3 3 8 13 18 23 28 33 38 43 48
# 4 4 9 14 19 24 29 34 39 44 49
# 5 5 10 15 20 25 30 35 40 45 50
PCQ <- function(D, A, ...)
{
require("lazyeval")
cols <- lazy_dots(...)
cols_names <- unlist(lapply(cols, function(x) as.character(x$expr)))
return( A^2 / (rowSums(D[,cols_names])/4)^2 )
}
PCQ(dat, 100, C1, C5, C7, C10)
# [1] 16.32486 15.08153 13.97502 12.98596 12.09830
但是可以使用select
包中的函数dplyr
创建更漂亮的解决方案。
PCQ2 <- function(D, A, ...)
{
require("dplyr")
return( A^2 / (rowSums(select(D, ...))/4)^2 )
}
PCQ2(dat, 100, C1, C5, C7, C10)
# [1] 16.32486 15.08153 13.97502 12.98596 12.09830