我正试图在绘制数据集之前构建数据集.我决定使用function factory gammaplot.ff(),我的代码的第一个版本如下:

PowerUtility1d <- function(x, delta = 4) {
  return(((x+1)^(1 - delta)) / (1 - delta))
}
PowerUtility1d <- Vectorize(PowerUtility1d, "x")

# function factory allows multiparametrization of PowerUtility1d()
gammaplot.ff <- function(type, gamma) {
  ff <- switch(type, 
               original = function(x) PowerUtility1d(x/10, gamma),
               pnorm_wrong = function(x) PowerUtility1d(2*pnorm(x)-1, gamma),
               pnorm_right = function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma)
              )
  ff
}

gammaplot.df <- data.frame(type=numeric(), gamma=numeric(), 
                           x=numeric(), y=numeric())
gammaplot.gamma <- c(1.1, 1.3, 1.5, 2:7)
gammaplot.pts <- (-1e4:1e4)/1e3

# building the data set
for (gm in gammaplot.gamma) {
   for (tp in c("original", "pnorm_wrong", "pnorm_right")) {
     fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)    
     dataChunk <- cbind(tp, gm, gammaplot.pts, fpts)
     colnames(dataChunk) <- names(gammaplot.df)
     gammaplot.df <- rbind(gammaplot.df, dataChunk)
   }
}

# rbind()/cbind() cast all data to character, but x and y are numeric
gammaplot.df$x <- as.numeric(as.character(gammaplot.df$x))
gammaplot.df$y <- as.numeric(as.character(gammaplot.df$y))

事实证明,整个数据帧都包含字符数据,所以我必须手动将其转换回来(我花了一段时间才发现!).所以搜索indicates,这是因为type变量是字符.为了避免这种情况(您可以想象在构建数据集时角色数据的性能问题!)我对代码做了一些修改:

gammaplot.ff <- function(type, gamma) {
  ff <- switch(type, 
               function(x) PowerUtility1d(x/10, gamma),
               function(x) PowerUtility1d(2*pnorm(x)-1, gamma),
               function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma)
              )
  ff
}

for (gm in gammaplot.gamma) {
  for (tp in 1:3) {
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)    
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts)
    colnames(dataChunk) <- names(gammaplot.df)
    gammaplot.df <- rbind(gammaplot.df, dataChunk)
  }
}

这对我来说很好,但我丢失了一个不言自明的字符参数,这是一个缺点.有没有办法在不将所有数据隐式转换为字符的情况下保留function factory的第一个版本?

如果有其他方法可以达到同样的效果,我很乐意try 一下.

推荐答案

你可以用rbind.data.framecbind.data.frame代替rbindcbind.

R相关问答推荐

从R中的另一个包扩展S3类的正确方法是什么

基于现有类创建类的打印方法(即,打印tibles更长时间)

MCMC和零事件二元逻辑回归

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

如何删除gggvenn与gggplot绘制的空白?

在数学中正确显示摄氏度、开氏度或华氏度

在某些栏和某些条件下,替换dfs列表中的NA

当月份额减go 当月份额

标识R中多个列中缺少的唯一值

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

如何改变x轴比例的列在面

IMF IFS数据以R表示

为什么在BASE R中绘制线条时会看到线上的点?

停止ggplot将多行减少到一行

如何将一些单元格的内容随机 Select 到一个数据框中?

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

基于R中的辅助向量中的值有条件地连接向量中的字符串

如何在R中使用因子行求和?

使用显式二元谓词子集化sfc对象时出错

如何准确地指出Read_delim所面临的问题?