【问题标题】:Error on executing rga.open(instance="ga", where="~/ga.rga") from a batch file从批处理文件执行 rga.open(instance="ga", where="~/ga.rga") 时出错
【发布时间】:2014-08-07 16:30:45
【问题描述】:

我正在尝试通过批处理文件运行 r 脚本,以便我可以安排 R 脚本定期运行。 R 脚本从 Google Analytics 检索数据并将数据转储到 SQL Server 数据库中。

R 脚本在 R Studio 下运行得非常好,但是当我尝试通过批处理文件执行相同的 R 脚本时,它会出现此错误 -

“body_config(body, multipart) 中的错误:找不到对象 redirect.uri 调用 rga.open ... modify_config -> setdiff -> as.vector -> body_config 执行停止”

我的批处理文件如下所示: "C:\Program Files\R\R-3.0.2\bin\Rscript.exe" "C:\Users\sc\Documents\R Sources\SocialMedia\ExtractBlogStats.r" 暂停

我的 Rscript 看起来像:

library(devtools)

#install_github("rga", "skardhamar")
library(rga)

#install.packages("RODBC")
library(RODBC)

myconn <- odbcDriverConnect('driver={SQL Server};server=localhost;database=SocialMedia;trusted_connection=true')


options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))

#rga.open(instance="ga")


rga.open(instance="ga", where="~/ga.rga")


id <- "XXXXXXXX" # Valid ID in actual script file

end <- Sys.Date() - 1
start <- end - 1

by.practice <- ga$getData(id, start.date = start, end.date= end, 
                        metrics = "ga:sessions,ga:totalEvents",
                        dimensions = "ga:eventAction",
                        sort = "",
                        filters = "",
                        segment = "",
                        start = 1,
                        max = 1000)

【问题讨论】:

  • 这里只是一个疯狂的猜测,但你是在代理后面工作吗?这可以解释为什么它可以在 RStudio 中工作而不是作为批处理脚本调用。
  • 您是否在运行 RStudio 的同一台机器上运行批处理文件?并且作为同一个用户?路径中的“~”用于用户特定的主目录,如果批处理脚本由调度程序运行,则不同的用户主目录可能用于“~”。也许尝试在那里设置完整路径?
  • @MrFlick - 是的,我在运行 RStudio 的同一台机器上以同一用户身份运行批处理文件。我的批处理文件中的两个路径都是完整路径。你有什么建议吗?
  • @user3749083 看起来where="~/ga.rga" 可能会因为那个波浪号而变得麻烦,并且在一个地方它使用了缓存的身份验证,而在另一个地方却没有。只是为了检查您可以打印出path.expand("~/ga.rga") 以查看它的解析位置。如果您在rga.open 之后仍然收到错误,您可能还需要添加traceback() 以了解它当时正在尝试做什么。
  • @MrFlick - 我包含了 path.expand 并注意到当我在 RStudio ("C:/Users/sc/Documents/ga.rga") 与批处理文件中运行时值存在差异(“C:\\Users\\sc\\Documents/ga.rga”)。我阅读了 where 子句并发现“如果您想在本地存储实例,可以通过添加 where 属性来完成:”。所以我修改了我的代码以指定显式路径而不是波浪号 [where ="C:/Users/sc/Documents/R Sources/SocialMedia/ga.rga"] 但它没有帮助。另外,我添加了 setwd("C:/Users/sc/Documents/R Sources/SocialMedia") 但这也无济于事。

标签: r batch-file google-analytics


【解决方案1】:

步骤: a) 在 RStudio 中执行 rga.open(instance="ga")

b) 这将我引导至 URL 并生成代码

c) 将代码粘贴到 RStudio 控制台中

d) 本地文件系统上保存的 ga 对象 -- save(ga, file="C:/Users/sc/Documents/R 来源/SocialMedia/ga.rga")

e) 从函数中删除了 rga.open 调用 - extract.blog.stats.by.practice()

extract.blog.stats.by.practice = function(id = "XXXXXXX") {
library(devtools)
library(rga)
library(RODBC)
myconn <- odbcDriverConnect('driver={SQL Server};server=localhost;database=SocialMediaSink;trusted_connection=true')

options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))

#rga.open(instance="ga")
setwd("C:/Users/sc/Documents/R Sources/SocialMedia")

end <- Sys.Date() - 1
start <- end - 1

by.practice <- NULL

by.practice <- ga$getData(id, start.date = start, end.date= end, 
                        metrics = "ga:sessions,ga:totalEvents",
                        dimensions = "ga:eventAction",
                        sort = "",
                        filters = "",
                        segment = "",
                        start = 1,
                        max = 1000)


# Convert Numeric To Integer
practice <- by.practice[,1]
sessions <- as.integer(by.practice[,2])
totalEvents <- as.integer(by.practice[,3])

# Create a dataframe that mimics the structure of the database table - BlogPracticeStats
practice.stats <- data.frame(practice, end, sessions, totalEvents, stringsAsFactors = FALSE)

# Assign columnnames that match the table's column name in the database
colnames(practice.stats) <- c("Practice", "Date", "Sessions", "TotalEvents")

# Insert rows in the table
sqlSave(myconn, practice.stats, "BlogPracticeStats", safer = FALSE, append = TRUE, rownames = FALSE)
odbcClose(myconn)

 }

f) 在 RunFunction.r 中包含来自本地保存副本的“ga”负载

source("C:/Users/sc/Documents/R Sources/SocialMedia/ExtractBlogPracticeStats.R")
load("C:/Users/sc/Documents/R Sources/SocialMedia/ga.rga")
extract.blog.stats.by.practice()

g) 执行的批处理文件

"C:\Program Files\R\R-3.0.2\bin\Rscript.exe" "C:\Users\sc\Documents\R Sources\SocialMedia\RunFunction.r"
pause

【讨论】:

    【解决方案2】:

    我想发布整个解决方案 -

    第 1 步——创建初始身份验证对象

    #Initial Objects
    # dev tools is needed because we need to use it's function install_github
    
    # install.packages("devtools")
    library(devtools)
    
    # install_github("rga", "skardhamar")
    library(rga)
    
    library(RODBC)
    
    config.folder.location <- "C:\\Users\\sc\\Documents\\R Sources\\SocialMedia\\Config"
    
    working.directory <- config.folder.location
    
    rga.open(instance="ga")
    
    save(ga, file="C:/Users/sc/Documents/R Sources/SocialMedia/config/ga.rga")
    
    
    connection.string <- 'driver={SQL Server};server=localhost;database=SocialMedia;trusted_connection=true'
    
    save(connection.string,  file = paste0(config.folder.location,'\\connection.string '))
    
    
    # Google Analytics ID for ur site
    google.analytics.id <- "XXXXXX"
    
    save(google.analytics.id, file="google.analytics.id")
    

    第 2 步 -- 查询 Google Analaytics

    # dev tools is needed because we need to use it's function install_github
    # install.packages("devtools")
    library(devtools)
    
    # install_github("rga", "skardhamar")
    library(rga)
    
    # install.packages("RODBC")
    library(RODBC)
    
    
    #*********************************************************************************************************************
    # Read arguments and store them in variables -- START
    #*********************************************************************************************************************
    args <- commandArgs(trailingOnly = TRUE)
    
    # First argument is read as working directory (location where config folder resides)
    working.directory <- as.character(args[1])
    
    if (length(args) >= 2){
      # Second argument is used as start date in GA Query
      start <- as.Date(args[2])
    }else{
     start <- Sys.Date() - 1
    }
    
    if (length(args) == 3){
    # Third argument is used as end date in GA Query  
     end <- as.Date(args[3]) 
    }else{
     end <- start
    }
    
    #*********************************************************************************************************************
    # Read arguments and store them in variables -- END
    #*********************************************************************************************************************
    
    #*********************************************************************************************************************
    # Use arguments values to setup the environment and load initial objects -- START
    #*********************************************************************************************************************
    
    # Set working directory to the passed value
    setwd(working.directory)
    
    # load Google Analytics ID from Config folder
    load("google.analytics.id")
    
    # Load SQL Connection String
    load("connection.string")
    
    options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))
    
    # load pre-authentcated Google Analytics object "ga"
    load("ga.rga")
    
    # Check if the ga token has expired. If it has then refersh token.
    if (ga$isTokenExpired()){
      ga$refreshToken()
    }
    
    #*********************************************************************************************************************
    # Use arguments values to setup the environment and load initial objects -- END
    #*********************************************************************************************************************
    
    # Runs Google Analytics query for the provided id and limits data by date (i.e., start.date = date and end.date = date)
    # Wrapped in try/catch to handle scenarios when GA does not return any rows
    
    
    
    blog.stats = tryCatch({
     ga$getData(google.analytics.id, 
                start.date = start, 
                end.date = end, 
                metrics = "ga:sessions, ga:users, ga:newUsers, ga:sessionDuration, ga:timeOnPage, ga:pageviews",
                dimensions = "ga:date, ga:pageTitle, ga:medium, ga:hasSocialSourceReferral, ga:source, ga:referralPath",
                sort = "",
                filters = "",
                segment = "",
                start = 1,
                max = 10000)           
     }, warning = function(w) { 
        # print("warning")
        return(NULL)
     }, error = function(e) {
        # print("error")
        return(NULL)
     }, finally = {  
        # print("inside Finally")
    }
    )
    
    if(length(blog.stats)>0 ){
    # Convert Numeric To Integer
      blog.stats[,"sessions"] <- as.integer(blog.stats[,"sessions"])
      blog.stats[,"users"] <- as.integer(blog.stats[,"users"])
      blog.stats[,"newUsers"] <- as.integer(blog.stats[,"newUsers"])
      blog.stats[,"sessionDuration"] <- as.integer(blog.stats[,"sessionDuration"])
      blog.stats[,"timeOnPage"] <- as.integer(blog.stats[,"timeOnPage"])
      blog.stats[,"pageviews"] <- as.integer(blog.stats[,"pageviews"])
    
    
    # Assign columnnames that match the table's column name in the database
    colnames(blog.stats) <- c("Date", "PageTitle", "Medium", "HasSocialSourceReferral", "TrafficSource", "ReferralPath", "Sessions", "Users", "NewUsers", "SessionDurationSeconds", "TimeOnPageSeconds", "PageViews" )
    
    # Open a Connection
    myconn <- odbcDriverConnect(connection.string)
    
    # Prepare Delete Query
    delete.query <- paste0("DELETE  FROM  GoogleAnalyticsBlogStats WHERE Date >='",start,"' AND Date <='",end,"'")
    
    # Execute Delete Query
    sqlQuery(myconn,delete.query,  errors= FALSE)
    
    
    # Insert rows in the table
    sqlSave(myconn, blog.stats, "GoogleAnalyticsBlogStats", safer = FALSE, append = TRUE, rownames = FALSE)
    
    # Close the connection to the database
    odbcClose(myconn)
    }
    

    步骤 3 --- 从批处理文件执行 Rscript

    批处理文件看起来像这样 -

    "C:\Program Files\R\R-3.1.0\bin\Rscript.exe" "D:\Social Media Analytics\R Scripts\ExtractGoogleAnalyticsBlogStats.r" "D:\\Social Media Analytics\\R Scripts\\Config" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-09
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2011-08-19
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多