如何在R中将两个字符向量与转义字符进行比较?

时间:2017-09-03 02:48:26

标签: r list escaping set-intersection

我从API获得了两个列表。我需要比较R中的两个列表以确定两个列表中存在哪些项目。我曾希望用intersect()命令做到这一点,但它没有用。经过进一步检查,我注意到每个列表实际上是一个单独的向量,包含由逗号和转义字符分隔的多个项目。是否可以将这些向量转换为多项列表,以便我可以比较列表?以下是一些示例代码:

我想要的是什么:

 > intersect(x,y)
 [[1]]
 [1] "c"

我所看到的是:

 > intersect(x,y)
 list()

 > as.character(x)
 c(\"a\", \"b\", \"c\")

 > as.character(x)
 c(\"c\", \"d\", \"e\")

这里发生了什么?我如何比较x和y?有没有办法将这些向量转换为列表,以便我可以使用intersect()命令?

编辑:精炼示例和澄清数据源

2 个答案:

答案 0 :(得分:2)

我仍然在猜这里,因为你没有回答我的问题,但是我看到你获得这样的输出的唯一方法是xy列表是实际上包含R代码的第一个元素,用于创建所需的矢量,如下所示。

x <- list('c("a", "b", "c")')
y <- list('c("c", "d", "e")')
intersect(x, y)
## list()
as.character(x)
## [1] "c(\"a\", \"b\", \"c\")"
as.character(y)
## [1] "c(\"c\", \"d\", \"e\")"

如果是这样,你需要做的是评估这些表达式,然后你会得到你认为有的向量。

xx <- eval(parse(text=x[[1]]))
yy <- eval(parse(text=y[[1]]))
xx
## [1] "a" "b" "c"
yy
## [1] "c" "d" "e"
intersect(xx, yy)

Ryan Runge建议“在不同语言或软件之间共享数据时,更频繁地发生这样的额外报价。因此,这可能是API访问方式的意外影响。” (谢谢!)

然而,这不适用于您给出的解释。需要更多信息!

答案 1 :(得分:-1)

感谢大家的建议。我能够像这样解决这个问题:

$eventList  = $cal->events->listEvents(
    'primary',
    array(
        'timeMin' =>''.$pastEvents.'T01:00:00Z',
        'timeMax' =>''.$futureEvents.'T23:59:59Z',
        'singleEvents' => true
    )
);
$eventItems = $eventList['items']; //From Google        
$x=0;
$events   = array();
$startDateTime ='';
$endDateTime ='';
$summary = '';
$start = array();
$end = array();

foreach($eventItems as $item) {
    if(isset($item['summary'])) {

         $summary = $item['summary'];

    }
    $start = $item['start'];
    if(isset($start['dateTime'])) { 

        $startDateTime = $start['dateTime'];

    }
    else if(isset($start['date'])) {

        $startDateTime = $start['date'];

    }
    $end = $item['end'];
    if(isset($end['dateTime'])) {

        $endDateTime = $end['dateTime'];

    }
    else if(isset($end['date'])) {

        $endDateTime = $end['date'];

    }

    $events[$x]['id']               = $item['id'];          
    $events[$x]['title']            = $summary;
    $events[$x]['start']            = $startDateTime;
    $events[$x]['end']              = $endDateTime;
    $events[$x]['allDay']           = true;
    $events[$x]['backgroundColor']  = '#0092D0';
    $x++;
}
$jsonEvents = json_encode($events);     

我真的不明白为什么在每个列表名称之后加上术语[[1]]可以解决问题,但似乎仍然如此。