R无法找到函数“ bt.matching.find”

时间:2019-07-24 17:01:24

标签: r error-handling compiler-errors

在Github上托管的bt.matching.find工具箱中实现函数SIT时遇到问题。按照here中描述的步骤下载工具箱后,我尝试复制此blog

中描述的代码
library(SIT.dates)
library(SIT)
objt <- bt.matching.find(Cl(data), normalize.fn = normalize.mean, dist.fn = 'dist.euclidean', plot=T)

R找不到函数,所以我尝试使用空格来访问函数

objt <- SIT:::bt.matching.find(Cl(data), normalize.fn = normalize.mean, dist.fn = 'dist.euclidean', plot=T)

但是这次我遇到了一个奇怪的错误,它与函数中的任何参数无关

Error in last(data, n.reference) : could not find function "last"

我使用功能bt.matching.find对功能getAnywhere进行了研究,这就是我得到的

getAnywhere("bt.matching.find")
A single object matching ‘bt.matching.find’ was found
It was found in the following places
  namespace:SIT
with value

function (data, n.query = 90, n.reference = 252 * 10, n.match = 10, 
    normalize.fn = normalize.mean.sd, dist.fn = dist.euclidean, 
    plot = FALSE, plot.dist = FALSE, layout = NULL, main = NULL) 
{
    data = last(data, n.reference)
    reference = coredata(data)
    n = len(reference)
    query = reference[(n - n.query + 1):n]
    reference = reference[1:(n - n.query)]
    main = paste(main, join(format(range(index(data)[(n - n.query + 
        1):n]), "%d%b%Y"), " - "))
    n.query = len(query)
    n.reference = len(reference)
    dist.fn.name = ""
    if (is.character(dist.fn)) {
        dist.fn.name = paste("with", dist.fn)
        dist.fn = get(dist.fn)
    }
    dist = rep(NA, n.reference)
    query.normalized = match.fun(normalize.fn)(query)
    for (i in n.query:n.reference) {
        window = reference[(i - n.query + 1):i]
        window.normalized = match.fun(normalize.fn)(window)
        dist[i] = match.fun(dist.fn)(rbind(query.normalized, 
            window.normalized))
        if (i%%100 == 0) 
            cat(i, "\n")
    }
    min.index = c()
    temp = dist
    temp[temp > mean(dist, na.rm = T)] = NA
    for (i in 1:n.match) {
            if (any(!is.na(temp))) {
            index = which.min(temp)
            min.index[i] = index
            temp[max(0, index - 2 * n.query):min(n.reference, 
                (index + n.query))] = NA
        }
    }
    n.match = len(min.index)
    if (plot) {
        dates = index(data)[1:len(dist)]
        if (is.null(layout)) {
            if (plot.dist) 
                layout(1:2)
            else layout(1)
        }
        par(mar = c(2, 4, 2, 2))
        if (plot.dist) {
            plot(dates, dist, type = "l", col = "gray", main = paste("Top 
Historical Matches for", 
                main, dist.fn.name), ylab = "Distance", xlab = "")
            abline(h = mean(dist, na.rm = T), col = "darkgray", 
                lwd = 2)
            points(dates[min.index], dist[min.index], pch = 22, 
                col = "red", bg = "red")
            text(dates[min.index], dist[min.index], 1:n.match, 
                adj = c(1, 1), col = "black", xpd = TRUE)
        }
        plota(data, type = "l", col = "gray", LeftMargin = 1, 
            main = iif(!plot.dist, paste("Top Historical Matches for", 
                main), NULL))
        plota.lines(last(data, 90), col = "blue")
        for (i in 1:n.match) {
            plota.lines(data[(min.index[i] - n.query + 1):min.index[i]], 
                col = "red")
        }
        text(index4xts(data)[min.index - n.query/2], reference[min.index - 
            n.query/2], 1:n.match, adj = c(1, -1), col = "black", 
            xpd = TRUE)
        plota.legend(paste("Pattern: ", main, ",Match Number"), 
            "blue,red")
    }
    return(list(min.index = min.index, dist = dist[min.index], 
        query = query, reference = reference, dates = index(data), 
        main = main))
}
<bytecode: 0x000000e7e11c8a00>
<environment: namespace:SIT>

我尝试使用backports包调用该函数

library(backports)
.onLoad <- function(libname, pkgname) {
  backports::import(SIT, "bt.matching.find", force = TRUE)
}

但这也不起作用

为什么R无法访问该功能?可能是因为此软件包是在较旧的版本下构建的吗?

其他信息

环境

sessionInfo()
R version 3.5.3 (2019-03-11)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8.1 x64 (build 9600)

1 个答案:

答案 0 :(得分:0)

该问题在软件包开发人员的帮助下得以解决,对于任何有兴趣使用该代码的人,这是应该做的调整

const orders=[{_id:"5d14a31490fb1e0012a3d2d8-1",orderId:"0JL5ORM0JT-1",created:"2019-06-27T11:05:56.377Z",createdDate:"2019-06-27T09:05:56.377Z",offers:[{price:95.27,fuel:{_id:"5ce13948eaef5200113b0de8",name:"Diesel B7",description:"Diesel",lpt:0,duty:0,type:"SPOT",created:"2019-05-19T11:08:56.417Z"}},{price:95.27,fuel:{_id:"5ce13948eaef5200113b0de8",name:"Petrol",description:"Petrol",lpt:0,duty:0,type:"SPOT",created:"2019-05-19T11:08:56.417Z"}},{price:95.27,fuel:{_id:"5ce13948eaef5200113b0de8",name:"Fossil Fuel",description:"Fossil Fuel",lpt:0,duty:0,type:"SPOT",created:"2019-05-19T11:08:56.417Z"},}]}];

orders.forEach(o => 
    o.offers.sort((a, b) => a.fuel.name.localeCompare(b.fuel.name))
);
    
console.log(orders)