React Native: Как я могу определить, работает ли мой код в симуляторе?

Вы можете использовать str.extract с fillna , последним столбцом падения B на drop :

df[['C','D']] = df['B'].str.extract('(.*)>`(.*)', expand=True)
df['D'] = df['D'].fillna(df['B'])
df['C'] = df['C'].fillna('')
df = df.drop('B', axis=1)

print df

   A  C     D
0  a  Y  abcd
1  b     abcd
2  c     efgh
3  d  Y  efgh

Следующее решение использует str.split с mask и numpy.where :

df[['C','D']] =  df['B'].str.split('>`', expand=True) 
mask = pd.notnull(df['D'])
df['D'] = df['D'].fillna(df['C'])
df['C'] = np.where(mask, df['C'], '')
df = df.drop('B', axis=1) 

Сроки:

В больших DataFrame решениях extract 100 раз быстрее, в малых 1.5 раз:

len(df)=4:

In [438]: %timeit a(df)
100 loops, best of 3: 2.96 ms per loop

In [439]: %timeit b(df1)
1000 loops, best of 3: 1.86 ms per loop

In [440]: %timeit c(df2)
The slowest run took 4.44 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 1.89 ms per loop

In [441]: %timeit d(df3)
The slowest run took 4.62 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 1.82 ms per loop

len(df)=4k:

In [443]: %timeit a(df)
1 loops, best of 3: 799 ms per loop

In [444]: %timeit b(df1)
The slowest run took 4.19 times longer than the fastest. This could mean that an intermediate result is being cached 
100 loops, best of 3: 7.37 ms per loop

In [445]: %timeit c(df2)
1 loops, best of 3: 552 ms per loop

In [446]: %timeit d(df3)
100 loops, best of 3: 9.55 ms per loop

Код:

import pandas as pd
df = pd.DataFrame({
       'A' : ['a', 'b','c', 'd'],
       'B' : ['Y>`abcd', 'abcd','efgh', 'Y>`efgh']
    })
#for test 4k    
df = pd.concat([df]*1000).reset_index(drop=True)
df1,df2,df3 = df.copy(),df.copy(),df.copy()

def b(df):
    df[['C','D']] = df['B'].str.extract('(.*)>`(.*)', expand=True)
    df['D'] = df['D'].fillna(df['B'])
    df['C'] = df['C'].fillna('')
    df = df.drop('B', axis=1)
    return df

def a(df):
    df = pd.concat([df, df.B.str.split('>').apply(
    lambda l: pd.Series({'C': l[0], 'D': l[1][1: ]}) if len(l) == 2 else \
        pd.Series({'C': '', 'D': l[0]}))], axis=1)
    del df['B']
    return df

def c(df):
    df[['C','D']] = df['B'].str.split('>`').apply(lambda x: pd.Series(['']*(2-len(x)) + x))
    df = df.drop('B', axis=1)    
    return df   

def d(df):
    df[['C','D']] =  df['B'].str.split('>`', expand=True) 
    mask = pd.notnull(df['D'])
    df['D'] = df['D'].fillna(df['C'])
    df['C'] = np.where(mask, df['C'], '')
    df = df.drop('B', axis=1) 
    return df  

29
задан Cherniv 11 January 2016 в 18:23
поделиться

5 ответов

Вы можете сделать это довольно легко с помощью act-native-device-info , например:

import DeviceInfo from 'react-native-device-info'

isSimulator() {
  return DeviceInfo.isEmulator();
},
52
ответ дан Lane Rettig 11 January 2016 в 18:23
поделиться

Используя act-native-device-info , вы можете получить следующие данные (выполненные на симуляторе):

getUniqueID: DB71DCB5-6BB0-497B-BE9E-A02BCC1235B7
getInstanceID: undefined
getDeviceId: x86_64
getManufacturer: Apple
getModel: Simulator
getBrand: Apple
getSystemName: iOS
getSystemVersion: 10.1
getBundleId: org.reactjs.native.example.project
getBuildNumber: 1
getVersion: 1.0
getReadableVersion: 1.0.1
getDeviceName:MacBook Pro
getUserAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72
getDeviceLocale: en
getDeviceCountry: US
getTimezone: America/Panama
isEmulator: true
isTablet: false
6
ответ дан chachan 11 January 2016 в 18:23
поделиться

Самое простое решение, которое я могу придумать, которое не требует создания собственного модуля (или изменения существующего), состоит в том, чтобы передать этот параметр в качестве свойства реагирующего компонента.

В вашем AppDelegate, где инициализируется RCTRootView, вы проверяете, является ли это симулятором, как если бы вы делали это в обычном приложении для iOS; Затем вы передаете эту информацию в корневое представление реагирования в виде initialProperties:

  BOOL isSimulator = NO;
#if TARGET_IPHONE_SIMULATOR
  isSimulator = YES;
#endif

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"ReactDemo"
                                               initialProperties:@{@"isSimulator": @(isSimulator)}
                                                   launchOptions:launchOptions];

Теперь вы можете получить к ней доступ в JavaScript через реквизиты вашего компонента реакции:

this.props.isSimulator

В Android у вас MainActivity, который расширяет ReactActivity, вы можете использовать аналогичный подход:

public boolean isEmulator() {
        return Build.FINGERPRINT.startsWith("generic")
                || Build.FINGERPRINT.startsWith("unknown")
                || Build.MODEL.contains("google_sdk")
                || Build.MODEL.contains("Emulator")
                || Build.MODEL.contains("Android SDK built for x86")
                || Build.MANUFACTURER.contains("Genymotion")
                || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
                || "google_sdk".equals(Build.PRODUCT);
    }

@Override
protected Bundle getLaunchOptions() {
    Bundle opts = new Bundle();
    opts.putBoolean("isEmulator", isEmulator());
    return opts;
}
21
ответ дан Artal 11 January 2016 в 18:23
поделиться

Если вы создаете приложение CRNA / Expo, вы можете использовать Expo.Constants.isDevice https://docs.expo.io/versions/latest/sdk/constants/#constantsisdevice

import { Constants } from 'expo'
//....

console.log(Constants.isDevice) // => false if simulator
10
ответ дан sguha 11 January 2016 в 18:23
поделиться

В настоящее время нет никакого способа узнать, работаете ли вы с симулятора в JS.

Я бы предложил добавить условное TARGET_IPHONE_SIMULATOR для проверки вашего нативного кода (если вы написали свой собственный модуль). Или, может быть, использовать сторонний модуль, который не рендерит камеру, если в симуляторе ... т.е. utf8 =% E2% 9C% 93 & амп; д = TARGET_IPHONE_SIMULATOR

1
ответ дан Dave Sibiski 11 January 2016 в 18:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: