自定义函数不起作用,但逐行起作用

Posted

技术标签:

【中文标题】自定义函数不起作用,但逐行起作用【英文标题】:User-defined function does not function, but line-by-line works 【发布时间】:2020-11-24 16:21:36 【问题描述】:

我的目标是定义一个函数,该函数基本上根据另一个表中的可选值的数量复制一行。每个新行将包含唯一可选值的组合。我在一个度量上运行了以下代码,但计划在成功定义一个函数后对多个度量使用循环。但是,该函数没有运行,但我可以将代码分块并且工作正常。提前致谢!

output_template_v2<-output_template_v1
measure <- "A"
col <- "1"

add_selOptions_to_output<-function(output_template_v2, measure, col, attributes)
if (tolower(str_sub(attributes$Attribute,-4, -1)) == "_sel")
  selOptions<-attributes[attributes$Measure.Name ==measure & attributes$Attribute == col & attributes$Program == "Blue",]

if (length(selOptions$Attribute > 0))
  subcopy<- output_template_v2[output_template_v2$Measure == measure,]
  output_template_v2<-output_template_v2[output_template_v2$Measure != measure,]
  subcopy<-subcopy[rep(1, length(selOptions$Attribute)),]

for (i in seq_along(selOptions))
  subcopy[,col][i]<-selOptions$Attribute[i]

output_template_v2 <-rbind(output_template_v2, subcopy)

【问题讨论】:

你能提供一个样本数据集吗?你可以简单地使用dput(data) 【参考方案1】:

函数可以工作——但它不会修改它的函数参数,因为函数参数被复制到函数中。相反,函数返回修改后的表。这已经可以了,但是函数最后一行的赋值是多余的,所以删除它:

add_selOptions_to_output <- function (output_template_v2, measure, col, attributes) 
  if (tolower(str_sub(attributes$Product.Attribute, -4L, -1L)) == "_sel") 
    selOptions <- attributes[
      attributes$Catalog.Measure.Name == measure &
      attributes$Product.Attribute == col &
      attributes$Program == "Blue", ]
  
  if (length(selOptions$Attribute.Values > 0)) 
    subcopy <- output_template_v2[output_template_v2$`Measure #` == measure, ]
    output_template_v2 <- output_template_v2[output_template_v2$`Measure #` != measure, ]
    subcopy <- subcopy[rep(1L, length(selOptions$Attribute.Values)), ]
  
  for (i in seq_along(selOptions)) 
    subcopy[, col][i] <- selOptions$Attribute.Values[i]
  
  rbind(output_template_v2, subcopy)

无论哪种方式,您都需要将函数的返回值分配回您调用它的参数,例如:

tmpl = add_selOptions_to_output(tmpl, measure, col, attributes)

【讨论】:

请注意,我的回答并没有尝试更改函数的实现以使其更具可读性,但我相信可以而且应该这样做。例如,rep 函数调用是奇数;如果我正确理解它的目的,它可以用seq_along(selOptions$Attribute.Values) 代替。并且可以完全删除 for 循环以支持单个分配。 谢谢!我应该补充一点,在我运行该函数后 output_template_v2 不会改变。应该在 output_template_v2 数据帧中添加另一个子副本行,如果我逐行运行它,我可以实现。

以上是关于自定义函数不起作用,但逐行起作用的主要内容,如果未能解决你的问题,请参考以下文章

为多个页面定义和调用自定义 AJAX 函数不起作用

使用自定义 json 函数检索数据时分页不起作用

ms 访问中的自定义 DateDiff 函数不起作用

自定义 Keras binary_crossentropy 损失函数不起作用

自定义模块中的函数在 PySpark 中不起作用,但在交互模式下输入时它们起作用

C 中的自定义函数在 Red Hat Linux 中不起作用,但在 HPUX 中可以