使用循环更改函数名称和过滤器值

时间:2019-08-12 15:30:31

标签: r

我正在对随机数据集进行聚类分析(精确数据集无关紧要)。在执行了分析并分配了最佳的簇编号以执行cutree()函数之后,我得到了一些重复的代码,用于生成摘要,并尝试通过循环替换这些摘要。

到目前为止,使用的代码是...

var pFrameOpt: UnsafeMutablePointer<AVFrame>? = av_frame_alloc()
avcodec_receive_frame(..., pFrameOpt)

let data3: UnsafeMutablePointer<UInt8>? = pFrameOpt?.pointee.data.3
data3?.withMemoryRebound(to: CVBuffer.self, capacity: 1) { pCvBuf in
    let fW = pFrameOpt!.pointee.width // print 3840
    let fH = pFrameOpt!.pointee.height // print 2160
    let fFmt = pFrameOpt!.pointee.format // print 160

    let cvBuf: CVBuffer = pCvBuf.pointee

    let a1 = CVPixelBufferGetDataSize(cvBuf)               // print 0
    let a2 = CVPixelBufferGetPixelFormatType(cvBuf)        // print 0
    let a3 = CVPixelBufferGetWidth(cvBuf)                  // print 0
    let a4 = CVPixelBufferGetHeight(cvBuf)                 // print 0
    let a5 = CVPixelBufferGetBytesPerRow(cvBuf)            // print 0
    let a6 = CVPixelBufferGetBytesPerRowOfPlane(cvBuf, 0)  // print 0
    let a7 = CVPixelBufferGetWidthOfPlane(cvBuf, 0)        // print 0
    let a8 = CVPixelBufferGetHeightOfPlane(cvBuf, 0)       // print 0
    let a9 = CVPixelBufferGetPlaneCount(cvBuf)             // print 0
    let a10 = CVPixelBufferIsPlanar(cvBuf)                 // print false
    let a11 = CVPixelBufferGetIOSurface(cvBuf)             // print nil
    let a12 = CVPixelBufferGetBaseAddress(cvBuf)           // print nil
    let a13 = CVPixelBufferGetBaseAddressOfPlane(cvBuf, 0) // print nil

    let b1 = CVImageBufferGetCleanRect(cvBuf)   // print 0, 0, 0, 0
    let b2 = CVImageBufferGetColorSpace(cvBuf)  // print nil 
    let b3 = CVImageBufferGetDisplaySize(cvBuf) // print 0, 0, 0, 0
    let b4 = CVImageBufferGetEncodedSize(cvBuf) // print 0, 0, 0, 0
    let b5 = CVImageBufferIsFlipped(cvBuf)      // print false

    // bad exec
    var cvTextureOut: CVMetalTexture?
    CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, ..., cvBuf, nil, .bgra8Unorm, 3840, 2160, 0, ...) 


}

我要替换的代码部分是...

    library(cluster)
    library(dplyr)
    library(psych)

    df_dist <- dist(df)                                 
    df_hclust <- hclust(df_dist, method = "ward.D2")    
    plot(df_hclust, hang = -1)                          
    df_hclust_cut <- cutree(df_hclust, k = 4)           
    df <- mutate(df, cluster = df_hclust_cut)   

我希望使用的代码是...

    cluster1 <- filter(df, cluster == 1)                
    cluster2 <- filter(df, cluster == 2)
    cluster3 <- filter(df, cluster == 3)
    cluster4 <- filter(df, cluster == 4)

但是随后我收到以下错误消息...

  

paste0(“ cluster”,C)中的错误<-filter(df,cluster == C):     分配目标扩展为非语言对象

如何创建一个循环以创建四个过滤的数据集,并更改过滤功能中使用的值?

1 个答案:

答案 0 :(得分:0)

如果您使用更复杂的表达式(如paste0

构造字符串,则此方法无效)

解决方案是将所有内容包装在assign中。

for (C in 1:4) {
      assign(paste0("cluster", C),filter(df, cluster == C)) 
    }