使用cashtag($)符号在列表中完成对象

时间:2017-10-05 14:49:25

标签: r

大家早上好,

我有一个非常简单的问题。

foo <- list(bar=2)

众所周知,我可以使用括号或使用cashtag($)符号访问bar对象。

> foo$bar
[1] 2
> foo[["bar"]]
[1] 2

如果我将bar替换为ba,我将使用cashtag($)获得相同的结果,但使用括号不同的结果。

> foo$ba
[1] 2
> foo[["ba"]]
NULL

在这种情况下,是否可以使用cashtag($)获取结果NULL而不是2

2 个答案:

答案 0 :(得分:4)

我不相信它可以让它返回NULL ,除非列表中还有其他东西也与输入部分匹配。因此,如果列表中有一个名为bak的元素,那么foo $ ba将返回null,因为部分匹配并不是唯一的。

> foo <- list(bar=2)
> foo$ba
[1] 2
> foo$bak <- NA
> foo$ba
NULL

如果/当发生部分匹配时,您也可以打开一个选项以发出警告。

> options(warnPartialMatchDollar = TRUE)
> foo <- list(bar = 2)
> foo$ba
[1] 2
Warning message:
In foo$ba : partial match of 'ba' to 'bar'

但是你可以看到它仍然返回部分匹配的值。如果你希望它在部分匹配的情况下返回NULL,那么我建议使用[[而不是$,一般来说,使用{{1}可能更好一点无论如何。

答案 1 :(得分:2)

我刚刚找到了使用@Dason帮助的方法。

import requests

from shapely.geometry import mapping, shape
from shapely.prepared import prep
from shapely.geometry import Point


data = requests.get("https://raw.githubusercontent.com/datasets/geo-countries/master/data/countries.geojson").json()

countries = {}
for feature in data["features"]:
    geom = feature["geometry"]
    country = feature["properties"]["ADMIN"]
    countries[country] = prep(shape(geom))

print(len(countries))

def get_country(lon, lat):
    point = Point(lon, lat)
    for country, geom in countries.iteritems():
        if geom.contains(point):
            return country

    return "unknown"

print(get_country(10.0, 47.0))
# Austria

这对我的需求来说很好。

谢谢您的提示!