gpt4 book ai didi

r - 为什么 R 代码可以在本地工作,但不能在 Docker 中运行?

转载 作者:行者123 更新时间:2023-12-02 19:52:15 24 4
gpt4 key购买 nike

我有一个 Docker 容器,它设置为每周通过 Airflow DAG 运行一个 R 脚本。 DAG 有 3 个事件 - 1 个事件位于 Docker 代码的上游,该代码从多个数据库获取数据,计算各种特征,然后将数据写入 S3。此脚本从 S3 存储桶中读取数据,格式化数据帧,运行模型对记录进行评分,然后将数据写回 S3。最后是下游代码,用于格式化输出,以便可以将其加载到 Salesforce 中。当我在 12 月编写和构建它时,该脚本在测试时工作。最近运行多次失败,错误代码如下:


Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
Calls: %>% ... mutate_impl -> ymd -> .parse_xxx -> unlist -> lapply -> FUN
Execution halted


好的,这似乎意味着它作为字符读取的日期在格式化为日期时存在问题。由于“ymd”在链中,我相信它是下面 R 脚本中的 Lubridate 函数。

Docker 文件(下面的代码)利用具有 Tidyverse 的 R 镜像,因为我的代码使用 Dplyr 和 Lubridate。我可能会在没有 Lubridate 的情况下使用基本函数来格式化日期,但更多内容如下

Docker 文件代码:

FROM rocker/tidyverse

RUN mkdir -p /model

RUN apt-get update -qq && apt-get install -y \
libssl-dev \
libcurl4-gnutls-dev

RUN R -e "install.packages('caret')"

RUN R -e "install.packages('randomForest')"

RUN R -e "install.packages('lubridate')"

RUN R -e "install.packages('aws.s3')"

EXPOSE 80

EXPOSE 8787

COPY / /

ENTRYPOINT ["Rscript", "account_health_scoring.R"]

R 脚本:由于一些识别信息和凭据,我必须排除前几行,但代码首先只是从文件中读取我的 S3 凭据。然后,此代码块运行并失败。下游有很多代码,但它们都在容器中起作用:
require("dplyr")
require("caret")
require("aws.s3")
require("randomForest")
require("lubridate")

#set credentials
Sys.setenv("AWS_ACCESS_KEY_ID" = "key",
"AWS_SECRET_ACCESS_KEY" = "key")

#read in model file
s3load("rf_gridsearch.RData", bucket = "account-model")


#read in data
data<-read.csv(text = rawToChar(get_object((paste0("account_health_data_",
gsub("-", "_", as.character(Sys.Date()),
fixed=TRUE),".csv")),
bucket = "account-health-model-input")),
stringsAsFactors = FALSE)%>%
mutate(period=ymd(period))%>%
mutate_if(is.integer,as.numeric)


2 条 mutate 行的原因是,尽管被格式化为 POSIX 时间戳,R 将日期强制转换为字符串并将浮点数强制转换为整数。也许我在 read.csv 中也遗漏了一些东西,或者有一个更好的函数可以正确读取数据,但这是我一直使用的。

问题:
  • 错误消息指的是什么/我认为 YMD 函数是罪魁祸首是否正确?
  • 如果是这样,我如何可能使用基本函数重写我的代码以实现相同的目标并避免依赖包。
  • 它可能是包依赖关系吗?在查看日志时,情况似乎并非如此,因为 Lubridate 导入了几个基本功能/使用了几个。自从我编写并测试了这段代码以来,这个包还没有更新。
  • 最佳答案

    嗯,答案似乎很简单,虽然我不明白。我变了


    require(lubridate)




    library(lubridate)


    它建立了。我找到了这篇文章 What is the difference between require() and library()?并决定尝试更改它,构建容器,并且它起作用了。我仍在试图理解“为什么”。

    关于r - 为什么 R 代码可以在本地工作,但不能在 Docker 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59954487/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com