传递给函数时字符串被截断

时间:2017-09-20 18:11:52

标签: r character string-length

我有一长串的广告系列名称,我需要将其折叠为长度为1的字符向量,然后传递为"其中"通过" RAdwords"来调用Google AdWords API的条款封装

创建此字符串不会出现问题,直到其长度达到某个值,这会导致值被截断,从而导致AdWords API调用出错。

以下是不会导致错误的设置示例:

campaigns <- paste0("Campaign ", seq(1,5))
collapsed_campaigns <- paste0(campaigns, collapse = "','")
campaign_filter1 <- paste("CampaignName IN ['", collapsed_campaigns, "']")

这是一个会导致错误的设置:

campaigns <- paste0("Campaign ", seq(1,50))
collapsed_campaigns <- paste0(campaigns, collapse = "','")
campaign_filter2 <- paste("CampaignName IN ['", collapsed_campaigns, "']")

检查每个变量的结构显示:

> str(campaign_filter1)
 chr "CampaignName IN [' Campaign 1','Campaign 2','Campaign 3',
 'Campaign 4','Campaign 5 ']"
> str(campaign_filter2)
 chr "CampaignName IN [' Campaign 1','Campaign 2','Campaign 3',
 'Campaign 4','Campaign 5','Campaign 6','Campaign 7','Campaign 8','Camp"| __truncated__

如果我通过&#39; campaign_filter1&#39;作为RAdwords中的where子句,事情按预期运行。

如果我通过&#39; campaign_filter2&#39;作为where子句,我收到此错误:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><reportDownloadError>
 <ApiError><type>QueryError.INVALID_WHERE_CLAUSE</type><trigger></trigger>
 <fieldPath></fieldPath></ApiError></reportDownloadError>

似乎&#34; |的截短&#34;正在逐字传递给RAdwords函数。

以下是检查&#34; traffic_data&#34;的结构的结果。在对RAdwords的失败调用中:

> str(traffic_data)
 Classes ‘data.table’ and 'data.frame': 1 obs. of  1 variable:
 $ ads: chr "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
 <reportDownloadError><ApiError><type>QueryError.INVALID_WHERE_CLAU"| __truncated__
 - attr(*, ".internal.selfref")=<externalptr> 

显然,我可以绕过这种循环函数并一次从API调用一个广告系列中的数据,但这样效率非常低。如何将整个字符串传递给RAdwords?

1 个答案:

答案 0 :(得分:0)

预先提出一个问题:为什么不下载所有广告系列数据并过滤R中的结果数据框?通过这种策略,整个字符串活动名称粘贴过程将变得多余。您可以根据R中的向量运算来过滤数据帧。这种方法可能更容易受到影响。

但是,如果您想在API调用中明确过滤广告系列,可以使用以下代码进行操作:

# 1. Download all campaigns
# query all campaign names
body1 <- statement(select=c('CampaignName'),
                  report="CAMPAIGN_PERFORMANCE_REPORT",
                  start="2017-11-01",
                  end="2017-11-02")
# download all campaign names
campaigns <- getData(clientCustomerId = "***-***-****",
                      google_auth = google_auth,
                      statement = body,
                      apiVersion = "201710",
                      transformation = T,
                      changeNames = T)
# 2. Build query with all campaigns in where clause
# build string for where clause
cmp_string <- paste0(campaigns$Campaign, collapse = "','")
cmp_string <- paste("CampaignName IN ['", cmp_string, "']", sep = "")
# query all campaigns with where condition
body2 <- statement(select = c('CampaignName'),
                  where = cmp_string,
                  report = "CAMPAIGN_PERFORMANCE_REPORT",
                  start = "2017-11-01",
                  end = "2017-11-02")
# download all campaigns using the where clause
campaigns2 <- getData(clientCustomerId = "***-***-****",
                     google_auth = google_auth,
                     statement = body,
                     apiVersion = "201710",
                     transformation = T,
                     changeNames = T)

在第一部分中,我下载了所有广告系列名称,以获取where子句的数据。在第二部分中,我将演示如何使用where子句再次下载所有广告系列,并将所有广告系列视为过滤器。

我用200多个广告系列测试了上面的代码。 RAdwords 包和Adwords API都没有任何问题。

我怀疑您传递给campaign_filter2的字符串存在问题。在paste()内,您将错过设置sep = ""。否则,您最终会在第一个广告系列名称的开头添加一个空格。